Скопіюйте / покладіть текст у буфер обміну за допомогою FireFox, Safari та Chrome


113

В Internet Explorer я можу використовувати об’єкт clipboardData для доступу до буфера обміну. Як я можу це зробити у FireFox, Safari та / або Chrome?


Якщо ви хочете зробити це в хромованій консолі, ви можете скористатися copy, developer.chrome.com/devtools/docs/commandline-api
wener


1
@ bjb568, питання, яке ви згадуєте, було введено пізніше, тож це дублікат
GvS

@GvS Не завжди йдеться про те, хто з них розміщений першим. Інший був більш популярним і отримав більше відповідей. Якщо ви хочете тхо, позначте його, щоб модератор міг об'єднати питання.
bjb568

Відповідь добре задокументовані в stackoverflow.com/a/30810322/712334
Джош Habdas

Відповіді:


21

Зараз існує спосіб легко зробити це в більшості сучасних браузерів за допомогою

document.execCommand('copy');

Це скопіює вибраний текст. Ви можете вибрати текстове поле або поле введення, використовуючи

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

Щоб непомітно скопіювати текст, ви можете швидко створити 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>


50

З міркувань безпеки 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 )


17
Третім недоліком є ​​те, що він не працюватиме локально (файл: //) без зміни дозволів на спалах. code.google.com/p/zeroclipboard - це бібліотека, побудована навколо цього методу.
Regis Frey

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

3
З 2014 року цей метод більше не працює в жодному сучасному браузері. ZeroClipboard - це єдина технологія, яка наразі вирішує це
Cozzamara

Станом на вересень 2015 року, Flash помирає порівняно швидко, і ZeroClipboard базується на її використанні. Дивіться мою відповідь нижче від серпня 2015 року щодо рішення, яке не використовує Flash.
кодер

13

Інтернетні електронні таблиці підключіть події Ctrl + C, Ctrl + V і перенесіть фокус на прихований елемент TextArea і або встановіть його вміст на потрібний новий вміст буфера обміну для копіювання, або прочитайте його вміст після закінчення події для вставки.

див. також Чи можна читати буфер обміну в Firefox, Safari та Chrome за допомогою Javascript?


10

Настало літо 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


1
Перше посилання, яке ви надаєте (на npmjs.com), говорить про те, що воно не працює з IE, але воно є (як насправді йдеться про GitHub)
gordon613,

9

У 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()вхідне поле перед тим, як викликати це.
Чад Счіра

Чи слід також видалити слухача події?
Кріс Уолш

1
@ChrisWalsh Так, це робиться всередині обробника в зразку коду. Причина в тому, що в іншому випадку обробник все ще буде в пам'яті.
Спойк

8

Firefox дозволяє зберігати дані у буфері обміну, але через наслідки безпеки він вимикається за замовчуванням. Дивіться, як увімкнути це в "Надання доступу до буфера обміну JavaScript" у базі знань Mozilla Firefox.

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


5

Функція copyIntoClipboard () працює для Flash 9, але, схоже, вона порушена випуском Flash Player 10. Ось рішення, яке працює з новим флеш-програвачем:

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

Це складне рішення, але воно працює.


6
Його не зламали. Він був видалений з найновішого API з міркувань безпеки
Гліцерин

4

Я мушу сказати, що жодне з цих рішень насправді працює. Я спробував вирішити буфер обміну з прийнятої відповіді, і це не працює з Flash Player 10. Я також спробував ZeroClipboard, і я був дуже задоволений цим деякий час.

Зараз я використовую його на своєму власному сайті ( http://www.blogtrog.com) ), але я помічав дивні помилки з ним. Як працює ZeroClipboard, це те, що він розміщує невидимий флеш-об’єкт поверх верхньої частини елемента на вашій сторінці. Я виявив, що якщо мій елемент рухається (наприклад, коли користувач змінює розмір вікна, і у мене все правильно вирівнюється), об’єкт Flash ZeroClipboard виходить з удару і більше не охоплює об'єкт. Я підозрюю, що він, мабуть, все ще сидить там, де був спочатку. У них є код, який повинен зупинити це або перенастроїти його на елемент, але він, здається, не працює добре.

Отже ... у наступній версії BlogTrog, я думаю, я буду дотримуватися відповідності з усіма іншими підсвічувачами коду, які я бачив у дикій природі, і видаляю кнопку "Копіювати у буфер обміну". :-(

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


3
Сумно, коли функціональні можливості повинні зробити крок назад в ім’я безпеки. Я дуже хочу, щоб було рішення, яке було б захищеним та все ж дозволяло отримати доступ до буфера обміну з веб-сторінки, навіть якщо користувач повинен надати йому явний дозвіл раз чи щось.
devios1

Ось що робить IE за замовчуванням
Matthew Lock

3

Занадто давнє запитання, але я не бачив цієї відповіді ніде ...

Перевірте це посилання:

http://kb.mozillazine.org/Granting_JavaScript_access_to_the_clipboard

як усі говорили, з міркувань безпеки за замовчуванням вимкнено. вище посилання показує інструкції, як його ввімкнути (відредагувавши про: config у firefox або user.js).

На щастя, є плагін під назвою "AllowClipboardHelper", який полегшує роботу лише з декількома клацаннями миші. однак вам все одно потрібно вказувати відвідувачам вашого веб-сайту про те, як дозволити доступ до Firefox.


Не припустимо, що для Chrome / WebKit є щось подібне?
devios1

3

Використовуйте сучасний 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>


2

Я використовував GitHub в Clippy для моїх потреб, простий кнопки флеш-додатків. Працює чудово, якщо стилістиці не потрібен і задоволений тим, що заздалегідь вставити те, що потрібно вставити на сервер.


1

Невелике вдосконалення рішення Flash - це виявлення для Flash 10 за допомогою swfobject:

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

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


1

http://www.rodsdot.com/ee/cross_browser_clipboard_copy_with_pop_over_message.asp працює з Flash 10 та всіма браузерами, що підтримують Flash.

Крім того, ZeroClipboard було оновлено, щоб уникнути помилки про прокручування сторінки, що призвело до того, що фільм Flash не буде в потрібному місці.

Оскільки цей метод "Потрібен", щоб користувач натискав кнопку, щоб скопіювати, це є зручністю для користувача, і нічого небезпечного не відбувається.


1

спробуйте створити глобальну змінну пам'яті, що зберігає виділення, тоді інша функція може отримати доступ до змінної та зробити приклад, наприклад.

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

}

3
можна скопіювати з будь-якого іншого місця, не розглядаючи лише всередині сторінки
Марван

1

Якщо ви підтримуєте флеш, ви можете використовувати 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)

Ви можете скористатися текстом та URL-адресом DataFormat для getData та setData.

І щоб видалити дані:

Ви можете використовувати файл, HTML, зображення, текст та URL-адресу DataFormat. PS: Вам потрібно використовувати window.clipboardData.clearData (DataFormat);

А для інших, які не підтримують window.clipboardData та флеш-файли SWF, ви також можете використовувати клавішу управління + клавішу c на клавіатурі для windows та для mac, її команда + c



1

Використовуйте 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>


1

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="/programming/127040/" rel="bookmark">Permalink</a>
<output></output>

З міркувань безпеки буфер обміну Permissionsможе знадобитися для читання та запису з буфера обміну. Якщо фрагмент не працює на SO, зніміть його localhostабо довіру, який довіряється іншим чином.


1

Будуючи відмінною відповіддю від @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
    };
})();
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.