Копировать/Поместить текст в буфер обмена с помощью FireFox, Safari и Chrome
В Internet Explorer я могу использовать объект clipboardData для доступа к буферу. Как это сделать в FireFox, Safari и/или Chrome?
Ответы
Ответ 1
Теперь в большинстве современных браузеров можно легко сделать это, используя
document.execCommand('copy');
Это скопирует выбранный в данный момент текст. Вы можете выбрать поле textArea или input, используя
document.getElementById('myText').select();
Чтобы невидимо скопировать текст, вы можете быстро сгенерировать textArea, изменить текст в поле, выбрать его, скопировать, а затем удалить textArea. В большинстве случаев этот текст не будет даже мигать на экране.
По соображениям безопасности браузеры позволят вам копировать, если пользователь предпринимает какое-либо действие (то есть нажатие кнопки). Один из способов сделать это - добавить событие onClick к кнопке html, которая вызывает метод, который копирует текст.
Полный пример будет выглядеть как
<html>
<head>
<title>copy test</title>
</head>
<body>
<button onclick="copier()">Copy</button>
<textarea id="myText">Copy me PLEASE!!!</textarea>
<script>
function copier(){
document.getElementById('myText').select();
document.execCommand('copy');
}
</script>
</body>
</html>
Ответ 2
Из соображений безопасности Firefox не позволяет размещать текст в буфере обмена. Тем не менее, существует возможность работы с Flash.
function copyIntoClipboard(text) {
var flashId = 'flashId-HKxmj5';
/* Replace this with your clipboard.swf location */
var clipboardSWF = 'http://appengine.bravo9.com/copy-into-clipboard/clipboard.swf';
if(!document.getElementById(flashId)) {
var div = document.createElement('div');
div.id = flashId;
document.body.appendChild(div);
}
document.getElementById(flashId).innerHTML = '';
var content = '<embed src="' +
clipboardSWF +
'" FlashVars="clipboard=' + encodeURIComponent(text) +
'" width="0" height="0" type="application/x-shockwave-flash"></embed>';
document.getElementById(flashId).innerHTML = content;
}
Единственным недостатком является то, что для этого требуется включить Flash.
Источник в настоящий момент мертв: http://bravo9.com/journal/copying-text-into-the-clipboard-with-javascript-in-firefox-safari-ie-opera-292559a2-cc6c-4ebf-9724-d23e8bc5ad8a/ (и так оно Google)
Ответ 3
Онлайн-таблицы перехватывают события Ctrl + C, Ctrl + V и переносят фокус на скрытый элемент управления TextArea и либо устанавливают его содержимое в желаемое новое содержимое буфера обмена для копирования, либо читают его содержимое после завершения события для вставки.
см. также Можно ли читать буфер обмена в Firefox, Safari и Chrome с помощью Javascript?
Ответ 4
Это лето 2015 года, и с таким количеством потрясений вокруг Flash я думал, что добавлю новый ответ на этот вопрос, который позволит избежать его использования в целом.
clipboard.js - хорошая утилита, которая позволяет копировать текстовые или html-данные в буфер обмена. Он очень прост в использовании, просто включите .js и используйте что-то вроде этого:
<button id='markup-copy'>Copy Button</button>
<script>
document.getElementById('markup-copy').addEventListener('click', function() {
clipboard.copy({
'text/plain': 'Markup text. Paste me into a rich text editor.',
'text/html': '<i>here</i> is some <b>rich text</b>'
}).then(
function(){console.log('success'); },
function(err){console.log('failure', err);
});
});
</script>
clipboard.js также находится на GitHub
Ответ 5
Firefox позволяет хранить данные в буфере обмена, но из-за последствий безопасности он по умолчанию отключен. Посмотрите, как включить его в "Предоставление доступа JavaScript в буфер обмена" в базе знаний Mozilla Firefox.
Решение, предлагаемое amdfan, является лучшим, если у вас много пользователей, и настройка их браузера не является вариантом. Хотя вы можете проверить, доступен ли буфер обмена, и предоставить ссылку на изменение настроек, если пользователи пользуются технологией. Редактор JavaScript TinyMCE следует этому подходу.
Ответ 6
В 2017 году вы можете это сделать (говоря об этом, потому что этот поток почти 9 лет!)
function copyStringToClipboard (string) {
function handler (event){
event.clipboardData.setData('text/plain', string);
event.preventDefault();
document.removeEventListener('copy', handler, true);
}
document.addEventListener('copy', handler, true);
document.execCommand('copy');
}
И теперь, чтобы скопировать copyStringToClipboard('Hello World')
Если вы заметили строку setData
и задались вопросом, можете ли вы установить разные типы данных, ответ будет да.
Ответ 7
Функция copyIntoClipboard() работает для Flash 9, но, похоже, она нарушена выпуском Flash Player 10. Вот решение, которое работает с новым флеш-плеером:
http://bowser.macminicolo.net/~jhuckaby/zeroclipboard/
Это сложное решение, но оно работает.
Ответ 8
Я должен сказать, что ни одно из этих решений действительно не работает. Я попробовал решение для буфера обмена из принятого ответа, и он не работает с Flash Player 10. Я также попробовал ZeroClipboard, и я был очень доволен этим некоторое время.
В настоящее время я использую его на своем собственном сайте (http://www.blogtrog.com), но я заметил с ним странные ошибки. Способ работы ZeroClipboard заключается в том, что он помещает невидимый объект flash поверх элемента на вашей странице. Я обнаружил, что если мой элемент перемещается (например, когда пользователь меняет размер окна, и я правильно выравниваю его), объект Flash ZeroClipboard выходит из строя и больше не закрывает объект. Я подозреваю, что он, вероятно, все еще сидит там, где он был изначально. У них есть код, который должен остановить это, или восстановить его для элемента, но он не работает хорошо.
Итак... в следующей версии BlogTrog, я думаю, я последую этому примеру со всеми другими маркерами кода, которые я видел в дикой природе, и удаляю кнопку "Копировать в буфер обмена".: - (
(Я заметил, что теперь dp.syntaxhiglighter Copy to Clipboard также сломан.)
Ответ 9
слишком старый вопрос, но я не видел этого ответа нигде...
Проверьте эту ссылку:
http://kb.mozillazine.org/Granting_JavaScript_access_to_the_clipboard
как все сказали, по соображениям безопасности по умолчанию отключено. в приведенной выше ссылке приведены инструкции по ее включению (путем редактирования about: config в firefox или user.js).
К счастью, есть плагин под названием "AllowClipboardHelper", который упрощает работу всего за несколько кликов. однако вам все равно нужно проинструктировать посетителей вашего сайта о том, как включить доступ в firefox.
Ответ 10
Я использовал Github Clippy для моих нужд, простая кнопка на основе Flash. Работает очень хорошо, если вам не нужен стиль и доволен вложением того, что нужно вставить на серверной стороне заранее.
Ответ 11
Использовать современный document.execCommand( "copy" )
и jQuery. fooobar.com/questions/4036/...
var ClipboardHelper = { // as Object
copyElement: function ($element)
{
this.copyText($element.text())
},
copyText:function(text) // Linebreaks with \n
{
var $tempInput = $("<textarea>");
$("body").append($tempInput);
$tempInput.val(text).select();
document.execCommand("copy");
$tempInput.remove();
}};
Как позвонить:
ClipboardHelper.copyText('Hello\nWorld');
ClipboardHelper.copyElement($('body h1').first());
// JQUERY DOCUMENT
;(function ( $, window, document, undefined ) {
var ClipboardHelper = {
copyElement: function ($element)
{
this.copyText($element.text())
},
copyText:function(text) // Linebreaks with \n
{
var $tempInput = $("<textarea>");
$("body").append($tempInput);
//todo prepare Text: remove double whitespaces, trim
$tempInput.val(text).select();
document.execCommand("copy");
$tempInput.remove();
}
};
$(document).ready(function()
{
var $body=$('body');
$body.on('click', '*[data-copy-text-to-clipboard]', function(event)
{
var $btn=$(this);
var text=$btn.attr('data-copy-text-to-clipboard');
ClipboardHelper.copyText(text);
});
$body.on('click', '.js-copy-element-to-clipboard', function(event)
{
ClipboardHelper.copyElement($(this));
});
});
})( jQuery, window, document );
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<span data-copy-text-to-clipboard=
"Hello
World">
Copy Text
</span>
<br><br>
<span class="js-copy-element-to-clipboard">
Hello
World
Element
</span>
Ответ 12
Небольшое усовершенствование решения Flash заключается в обнаружении вспышки 10 с использованием swfobject:
http://code.google.com/p/swfobject/
а затем, если он отображается как вспышка 10, попробуйте загрузить объект Shockwave с помощью javascript. Shockwave может читать/записывать в буфер обмена (во всех версиях), используя команду copyToClipboard() в lingo.
Ответ 13
http://www.rodsdot.com/ee/cross_browser_clipboard_copy_with_pop_over_message.asp работает с Flash 10 и всеми браузерами с поддержкой Flash.
Также обновлен ZeroClipboard, чтобы избежать ошибки, связанной с прокруткой страницы, в результате чего фильм Flash больше не находится в правильном месте.
Так как этот метод "Требует", чтобы пользователь нажимал кнопку, чтобы скопировать, это удобство для пользователя, и ничего не происходит.
Ответ 14
Если вы поддерживаете flash, вы можете использовать https://everyplay.com/assets/clipboard.swf и использовать текст flashvars для установки текста
https://everyplay.com/assets/clipboard.swf?text=It%20Works
Это тот, который я использую для копирования, и вы можете установить его как дополнительную, если не поддерживает эти параметры, которые вы можете использовать:
Для Internet Explorer: window.clipboardData.setData(DataFormat, Text) и window.clipboardData.getData(DataFormat)
Вы можете использовать TextFormat Text и Url для getData и setData.
И для удаления данных:
Вы можете использовать DataFormat File, HTML, Image, Text и URL. PS: вам нужно использовать window.clipboardData.clearData(DataFormat);
И для других, которые не поддерживают файлы window.clipboardData и swf flash, вы также можете использовать кнопку управления + c на клавиатуре для окон, а для mac - команду + c
Ответ 15
Код аддона:
Если кто-то еще искал, как это сделать из хром-кода, вы можете использовать интерфейс nsIClipboardHelper, как описано здесь: https://developer.mozilla.org/en-US/docs/Using_the_Clipboard
Ответ 16
Используйте document.execCommand('copy')
. Поддерживается в последних версиях Chrome
, Firefox
, Edge
и Safari
.
function copyText(text){
function selectElementText(element) {
if (document.selection) {
var range = document.body.createTextRange();
range.moveToElementText(element);
range.select();
} else if (window.getSelection) {
var range = document.createRange();
range.selectNode(element);
window.getSelection().removeAllRanges();
window.getSelection().addRange(range);
}
}
var element = document.createElement('DIV');
element.textContent = text;
document.body.appendChild(element);
selectElementText(element);
document.execCommand('copy');
element.remove();
}
var txt = document.getElementById('txt');
var btn = document.getElementById('btn');
btn.addEventListener('click', function(){
copyText(txt.value);
})
<input id="txt" value="Hello World!" />
<button id="btn">Copy To Clipboard</button>
Ответ 17
попробуйте создать глобальную переменную памяти, сохраняющую выбор, тогда другая функция может получить доступ к переменной и сделать пасту, например.
var memory = '';//outside the functions but within the script tag.
function moz_stringCopy(DOMEle,firstPos,secondPos) {
var copiedString = DOMEle.value.slice(firstPos, secondPos);
memory = copiedString;
}
function moz_stringPaste(DOMEle, newpos) {
DOMEle.value = DOMEle.value.slice(0,newpos) + memory + DOMEle.value.slice(newpos);
}
Ответ 18
API буфера обмена предназначен для замены document.execCommand
. Safari все еще работает над поддержкой, поэтому вы должны предоставить запасной вариант до тех пор, пока спецификация не установится и Safari не завершит реализацию.
const permalink = document.querySelector('[rel="bookmark"]');
const output = document.querySelector('output');
permalink.onclick = evt => {
evt.preventDefault();
window.navigator.clipboard.writeText(
permalink.href
).then(() => {
output.textContent = 'Copied';
}, () => {
output.textContent = 'Not copied';
});
};
<a href="#" onclick="location.href='https://stackoverflow.com/info/127040/'; return false;" rel="bookmark">Permalink</a>
<output></output>