Скопируйте / поместите текст в буфер обмена с FireFox, Safari и Chrome

в Internet Explorer я могу использовать объект clipboardData для доступа к буферу обмена. Как это сделать в FireFox, Safari и / или Chrome?

17 ответов


теперь есть способ легко сделать это в большинстве современных браузеров, используя

document.execCommand('copy');

это будет копировать выделенный текст. Вы можете выбрать текстовое поле или поле ввода

document.getElementById('myText').select();

чтобы незаметно Скопировать текст, вы можете быстро создать textArea, изменить текст в поле, выбрать его, скопировать его, а затем удалить 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>

по соображениям безопасности 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)


онлайн-таблицы Хук Ctrl+C, Ctrl+V события и перенести фокус на скрытый элемент управления TextArea и либо установить его содержимое в нужное новое содержимое буфера обмена для копирования или прочитать его содержимое после завершения события для вставки.

см. также можно ли читать буфер обмена в Firefox, Safari и Chrome с помощью Javascript?


Это лето 2015, и с такой суматохой, окружающей Flash, я думал, что добавлю новый ответ на этот вопрос, который полностью избегает его использования.

буфер обмена.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>

буфер обмена.js также включен GitHub


Firefox позволяет хранить данные в буфере обмена, но из-за последствий для безопасности он отключен по умолчанию. Узнать, как включить его в "предоставление доступа JavaScript к буферу обмена" в Базе Знаний Mozilla Firefox.

решение, предлагаемое amdfan, является лучшим, если у вас много пользователей и настройка их браузера не является вариантом. Хотя вы можете проверить, доступен ли буфер обмена и предоставить ссылку для изменения настроек, если пользователи технически подкованы. Редактор JavaScript TinyMCE следующий подход.


в 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 line, и задался вопросом, можете ли вы установить разные типы данных, ответ-да.


функция copyIntoClipboard () работает для Flash 9, но она, похоже, нарушена выпуском Flash player 10. Вот решение, которое работает с новым Flash player:

http://bowser.macminicolo.net / ~jhuckaby / zeroclipboard/

Это сложное решение, но оно работает.


Я должен сказать, что ни одно из этих решений действительно работа. Я попробовал решение буфера обмена из принятого ответа, и он не работает с Flash Player 10. Я также пробовал ZeroClipboard, и я был очень доволен им некоторое время.

в настоящее время я использую его на своем собственном сайте (http://www.blogtrog.com), но я заметил странные ошибки с ним. Способ работы ZeroClipboard заключается в том, что он помещает невидимый flash-объект поверх элемент на Вашей странице. Я обнаружил, что если мой элемент перемещается (например, когда пользователь изменяет размер окна, и у меня все выровнено), объект zeroclipboard flash выходит из строя и больше не покрывает объект. Я подозреваю, что он, вероятно, все еще сидит там, где был изначально. У них есть код, который должен остановить это или восстановить его в элементе, но он, похоже, не работает хорошо.

Так... в следующей версии BlogTrog, я думаю, я последую примеру со всем другим кодом маркеры, которые я видел в дикой природе,и удалите мою копию в буфер обмена. :-(

(Я заметил, что dp.копия syntaxhiglighter в буфер обмена также нарушена.)


слишком старый вопрос, но я нигде не видел этого ответа...

, проверьте эту ссылку:

http://kb.mozillazine.org/Granting_JavaScript_access_to_the_clipboard

как все говорили, по соображениям безопасности по умолчанию отключен. ссылка выше показывает Инструкции о том, как включить его (путем редактирования о:config в firefox или пользователь.в JS).

к счастью, есть плагин под названием "AllowClipboardHelper", который делает легче всего в несколько кликов. однако вам все равно нужно проинструктировать посетителей вашего сайта о том, как включить доступ в firefox.


Я использовал GitHub это до для моих нужд, простая кнопка на основе вспышки. Работает просто отлично, если не нужен стиль и доволен вставкой что надо вставить на стороне сервера заранее.


используйте современный документ.кадр execcommand("копия") и jQuery. см. этот ответ stackoverflow

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>

небольшое улучшение решения Flash заключается в обнаружении для flash 10 с помощью swfobject:

http://code.google.com/p/swfobject/

а затем, если он отображается как flash 10, попробуйте загрузить объект Shockwave с помощью javascript. Shockwave может читать / писать в буфер обмена (во всех версиях), а также с помощью команды copyToClipboard () на жаргоне.


http://www.rodsdot.com/ee/cross_browser_clipboard_copy_with_pop_over_message.asp работает с Flash 10 и всеми браузерами с поддержкой Flash.

также ZeroClipboard был обновлен, чтобы избежать ошибки, упомянутой о прокрутке страницы, в результате чего Флэш-фильм больше не будет в правильном месте.

поскольку этот метод "требует", чтобы пользователь нажал кнопку, чтобы скопировать это удобство для пользователя, и ничего не происходит.


Если вы поддерживаете flash, вы можете использоватьhttps://everyplay.com/assets/clipboard.swf и используйте текст flashvars, чтобы установить текст

https://everyplay.com/assets/clipboard.swf?text=It%20Works

Это тот, который я использую для копирования, и вы можете установить как дополнительную, если не поддерживает эти параметры, которые можно использовать :

Для Internet Explorer:


из аддона код:

Если кто-то еще искал, как это сделать из кода chrome, вы можете использовать интерфейс nsIClipboardHelper, как описано здесь:https://developer.mozilla.org/en-US/docs/Using_the_Clipboard


использовать 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>

попробуйте создать глобальную переменную памяти, хранящую выделение, затем другая функция может получить доступ к переменной и, например, вставить..

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);

}