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

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

Если вы хотите сделать это в консоли Chrome, вы можете использовать copy, developer.chrome.com/devtools/docs/commandline-api

wener 07.07.2014 06:49

возможный дубликат Как скопировать в буфер обмена в JavaScript?

bjb568 27.08.2014 23:20

@ bjb568, вопрос, который вы упомянули, был введен позже, так что это дубликат

GvS 28.08.2014 17:56

@GvS Не всегда о том, какой из них публикуется первым. Другой был более популярным и получил больше ответов. Если хотите, отметьте это, чтобы модератор мог объединить вопросы.

bjb568 28.08.2014 18:00

Ответ хорошо задокументирован в stackoverflow.com/a/30810322/712334

Josh Habdas 03.02.2019 16:36

Полная копия Как скопировать в буфер обмена в JavaScript?

Kaiido 09.03.2019 15:10
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
114
6
128 351
19
Перейти к ответу Данный вопрос помечен как решенный

Ответы 19

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

Третий недостаток заключается в том, что он не будет работать локально (file: //) без изменения разрешений на флеш-память. code.google.com/p/zeroclipboard - это библиотека, построенная на основе этого метода.

Regis Frey 30.04.2010 00:03

@ b1naryatr0phy: По большей части верно, но HTML5 все еще не имеет замены функциональности буфера обмена, предлагаемой в настоящее время Flash (например, с использованием ZeroClipboard).

James M. Greene 17.01.2013 20:45

По состоянию на 2014 год этот метод больше не работает ни в одном современном браузере. ZeroClipboard - единственная технология, которая в настоящее время решает эту проблему.

Cozzamara 19.02.2014 12:58

По состоянию на сентябрь 2015 года Flash умирает относительно быстрой смертью, и ZeroClipboard основан на его использовании. См. Мой ответ от августа 2015 года ниже, чтобы узнать о решении, в котором не используется Flash.

a coder 01.09.2015 14:55

Firefox позволяет хранить данные в буфере обмена, но из соображений безопасности по умолчанию он отключен. Посмотрите, как включить его, в «Предоставление JavaScript доступа к буферу обмена» в базе знаний Mozilla Firefox.

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

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

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

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

Это не сломано. Он был удален из новейшего API по соображениям безопасности.

Glycerine 22.02.2011 14:15

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

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

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

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

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

devios1 21.03.2012 19:34

Это то, что IE делает по умолчанию

Matthew Lock 02.07.2012 09:43

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

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

Небольшое улучшение решения для 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-ролик больше не находится в нужном месте.

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

Я использовал Github Clippy для своих нужд, простую кнопку на основе Flash. Работает отлично, если не нужно стилизовать и доволен заранее вставкой что наклеить на стороне сервера.

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

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

}

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

Marwan 02.05.2011 13:12

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

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

http://kb.mozillazine.org/Granting_JavaScript_access_to_the_clipboard

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

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

Не думаете, что есть что-то подобное для Chrome / WebKit?

devios1 21.03.2012 19:35

Если вы поддерживаете 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)

Вы можете использовать DataFormat Text и Url для getData и setData.

И чтобы удалить данные:

Вы можете использовать DataFormat's File, HTML, Image, Text и URL. PS: вам нужно использовать window.clipboardData.clearData (DataFormat);

А для других, которые не поддерживают flash-файлы window.clipboardData и swf, вы также можете использовать кнопку control + c на клавиатуре для Windows, а для Mac - команду + c

Из кода аддона:

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

Сейчас лето 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.info('success'); },
    function(err){console.info('failure', err);
  });

});
</script>

clipboard.js также находится на GitHub

Первая ссылка, которую вы предоставляете (на npmjs.com), говорит, что она не работает с IE, но работает (как на самом деле написано на GitHub)

gordon613 19.08.2015 15:51
Ответ принят как подходящий

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

document.execCommand('copy');

Это скопирует текущий выделенный текст. Вы можете выбрать textArea или поле ввода, используя

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

Чтобы невидимо скопировать текст, вы можете быстро сгенерировать textArea, изменить текст в поле, выбрать его, скопировать, а затем удалить textArea. В большинстве случаев этот textArea даже не мигает на экране.

По соображениям безопасности браузеры разрешают копирование только в том случае, если пользователь выполняет какое-либо действие (например, щелкает кнопку). Один из способов сделать это - добавить событие onClick к кнопке html, которая вызывает метод, копирующий текст.

Полный пример:

function copier(){
  document.getElementById('myText').select();
  document.execCommand('copy');
}
<button onclick = "copier()">Copy</button>
<textarea id = "myText">Copy me PLEASE!!!</textarea>

Используйте 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>

Используйте современный document.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>

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

для сафари мне нужно было запустить .select() в поле ввода, прежде чем вызывать это.

Chad Scira 24.06.2017 03:12

Следует ли вам также удалить прослушиватель событий?

Chris Walsh 09.05.2018 13:44

@ChrisWalsh Да, это делается внутри обработчика в примере кода. Причина в том, что в противном случае обработчик все еще будет в памяти.

Spoike 25.03.2019 11:56

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 = "https://stackoverflow.com/questions/127040/" rel = "bookmark">Permalink</a>
<output></output>

По соображениям безопасности буфер обмена Permissions может потребоваться для чтения и записи из буфера обмена. Если фрагмент не работает на SO, попробуйте localhost или другой доверенный домен.

Основываясь на отличном ответе @David из Studio.201, это работает в Safari, FF и Chrome. Это также гарантирует, что textarea не сможет мигать, если вынесет его за пределы экрана.

// ================================================================================
// ClipboardClass
// ================================================================================
var ClipboardClass = (function() {


   function copyText(text) {
    // Create temp element off-screen to hold text.
        var tempElem = $('<textarea style = "position: absolute; top: -8888px; left: -8888px">');
        $("body").append(tempElem);

        tempElem.val(text).select();
        document.execCommand("copy");
        tempElem.remove();
   }


    // ============================================================================
   // Class API
   // ============================================================================
    return {
        copyText: copyText
    };
})();

Другие вопросы по теме