Як скопіювати в буфер обміну в JavaScript?


3318

Який найкращий спосіб скопіювати текст у буфер обміну? (мульти браузер)

Я намагався:

function copyToClipboard(text) {
    if (window.clipboardData) { // Internet Explorer
        window.clipboardData.setData("Text", text);
    } else {  
        unsafeWindow.netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");  
        const clipboardHelper = Components.classes["@mozilla.org/widget/clipboardhelper;1"].getService(Components.interfaces.nsIClipboardHelper);  
        clipboardHelper.copyString(text);
    }
}

але в Internet Explorer він видає синтаксичну помилку. У Firefox йдеться unsafeWindow is not defined.

Гарний трюк без спалаху: Як Trello отримує доступ до буфера обміну користувача?


Цікаво, що ви хочете скопіювати у буфер обміну, що користувач не може зробити сам?
сканліфф

233
Нічого особливого. Вони можуть зробити це самостійно, але я хочу запропонувати також можливість натиснути кнопку, не турбуючись про те, щоб вибрати правильну частину тексту.
Сантьяго Корредора

4
Цей довгий пост у блозі містить безліч способів зробити це: Доступ до буфера обміну системою JavaScript - Святий Грааль?
Аарон Дігулла

Це дає браузеру невизначений виняток в IE, а також у FF
Jagadeesh

1
Якщо ми можемо помістити текст у буфер обміну користувача, ми можемо зіпсувати його буфер обміну.
Френк Фанг

Відповіді:


2242

Огляд

Існує три основні API браузера для копіювання в буфер обміну:

  1. API буфера обміну Async [navigator.clipboard.writeText]
    • Текстова частина, доступна в Chrome 66 (березень 2018 року)
    • Доступ асинхронний і використовує Обіцяння JavaScript , можна писати так, щоб підказки користувачів безпеки (якщо вони відображаються) не перебивали JavaScript на сторінці.
    • Текст можна скопіювати у буфер обміну безпосередньо зі змінної.
    • Підтримується лише на сторінках, що подаються через HTTPS.
    • У веб-переглядачах Chrome 66 на активних вкладках можна записувати у буфер обміну без відповідного запиту.
  2. document.execCommand('copy')
    • Більшість браузерів підтримують це станом на ~ квітня 2015 року (див. Підтримку браузера нижче).
    • Доступ синхронний, тобто зупиняє JavaScript на сторінці до повного включення відображення та взаємодії користувача з будь-якими запитами безпеки.
    • Текст читається з DOM та розміщується у буфері обміну.
    • Під час тестування ~ квітня 2015 року лише Internet Explorer було відмічено як відображення дозволів під час запису в буфер обміну.
  3. Перезапис події копіювання
    • Див. Документацію API буфера обміну щодо переосмислення події копіювання .
    • Дозволяє змінювати те, що з’являється у буфері обміну з будь-якої події копіювання, може включати інші формати даних, крім звичайного тексту.
    • Тут не висвітлено, оскільки це не відповідає безпосередньо на питання.

Загальні конспекти розвитку

Не очікуйте, що команди, пов’язані з буфером, працюватимуть під час тестування коду в консолі. Як правило, сторінка повинна бути активною (Async Clipboard API) або вимагає взаємодії з користувачем (наприклад, натисканням користувача), щоб дозволити ( document.execCommand('copy')) отримати доступ до буфера обміну, див. Нижче для отримання більш детальної інформації.

ВАЖЛИВО (зазначено тут 2020/02/20)

Зауважте, що оскільки ця публікація спочатку писала анулювання дозволів у перехресних джерелах IFRAME та інших "пісочниць" IFRAME, заважає вбудованим демо-кнопкам "Запустити фрагмент коду" та "codepen.io приклад" працювати в деяких браузерах (включаючи Chrome та Microsoft Edge ).

Щоб розробити, створіть власну веб-сторінку, подайте її на з'єднання HTTPS для тестування та розробки.

Ось тестова / демонстраційна сторінка, яка демонструє працюючий код: https://deanmarktaylor.github.io/clipboard-test/

Async + Fallback

Завдяки рівню підтримки браузера для нового API Async Clipboard ви, швидше за все, захочете відмовитися від document.execCommand('copy')методу, щоб отримати гарне покриття браузера.

Ось простий приклад (може не працювати, вбудований на цей сайт, читайте "важливу" примітку вище):

function fallbackCopyTextToClipboard(text) {
  var textArea = document.createElement("textarea");
  textArea.value = text;
  
  // Avoid scrolling to bottom
  textArea.style.top = "0";
  textArea.style.left = "0";
  textArea.style.position = "fixed";

  document.body.appendChild(textArea);
  textArea.focus();
  textArea.select();

  try {
    var successful = document.execCommand('copy');
    var msg = successful ? 'successful' : 'unsuccessful';
    console.log('Fallback: Copying text command was ' + msg);
  } catch (err) {
    console.error('Fallback: Oops, unable to copy', err);
  }

  document.body.removeChild(textArea);
}
function copyTextToClipboard(text) {
  if (!navigator.clipboard) {
    fallbackCopyTextToClipboard(text);
    return;
  }
  navigator.clipboard.writeText(text).then(function() {
    console.log('Async: Copying to clipboard was successful!');
  }, function(err) {
    console.error('Async: Could not copy text: ', err);
  });
}

var copyBobBtn = document.querySelector('.js-copy-bob-btn'),
  copyJaneBtn = document.querySelector('.js-copy-jane-btn');

copyBobBtn.addEventListener('click', function(event) {
  copyTextToClipboard('Bob');
});


copyJaneBtn.addEventListener('click', function(event) {
  copyTextToClipboard('Jane');
});
<div style="display:inline-block; vertical-align:top;">
  <button class="js-copy-bob-btn">Set clipboard to BOB</button><br /><br />
  <button class="js-copy-jane-btn">Set clipboard to JANE</button>
</div>
<div style="display:inline-block;">
  <textarea class="js-test-textarea" cols="35" rows="4">Try pasting into here to see what you have on your clipboard:

  </textarea>
</div>

(приклад codepen.io може не працювати, читайте "важливу" примітку вище). Зверніть увагу, що цей фрагмент не працює добре у вбудованому попередньому попередньому перегляді Stack Overflow. Спробуйте його тут: https://codepen.io/DeanMarkTaylor/pen/RMRaJX?editors = 1011

API буфера обміну Async

Зауважте, що існує можливість "вимагати дозволу" та перевірити на доступ до буфера обміну через API дозволів у Chrome 66.

var text = "Example text to appear on clipboard";
navigator.clipboard.writeText(text).then(function() {
  console.log('Async: Copying to clipboard was successful!');
}, function(err) {
  console.error('Async: Could not copy text: ', err);
});

document.execCommand ('копія')

У решті цього допису йдеться про нюанси та деталізацію document.execCommand('copy')API.

Підтримка браузера

Підтримка JavaScript document.execCommand('copy')зросла, дивіться посилання нижче для оновлень браузера:

Простий приклад

(можливо, не працює вбудований у цей сайт, читайте "важливу" примітку вище)

var copyTextareaBtn = document.querySelector('.js-textareacopybtn');

copyTextareaBtn.addEventListener('click', function(event) {
  var copyTextarea = document.querySelector('.js-copytextarea');
  copyTextarea.focus();
  copyTextarea.select();

  try {
    var successful = document.execCommand('copy');
    var msg = successful ? 'successful' : 'unsuccessful';
    console.log('Copying text command was ' + msg);
  } catch (err) {
    console.log('Oops, unable to copy');
  }
});
<p>
  <button class="js-textareacopybtn" style="vertical-align:top;">Copy Textarea</button>
  <textarea class="js-copytextarea">Hello I'm some text</textarea>
</p>

Складний приклад: Скопіюйте у буфер обміну, не відображаючи введення

Наведений вище простий приклад чудово працює, якщо на екрані видно textareaабо inputелемент.

У деяких випадках ви можете скопіювати текст у буфер обміну, не відображаючи input/ textareaелемент. Це один із прикладів способу подолати це (в основному вставити елемент, скопіювати у буфер обміну, видалити елемент):

Тестовано з Google Chrome 44, Firefox 42.0a1 та Internet Explorer 11.0.8600.17814.

(можливо, не працює вбудований у цей сайт, читайте "важливу" примітку вище)

function copyTextToClipboard(text) {
  var textArea = document.createElement("textarea");

  //
  // *** This styling is an extra step which is likely not required. ***
  //
  // Why is it here? To ensure:
  // 1. the element is able to have focus and selection.
  // 2. if element was to flash render it has minimal visual impact.
  // 3. less flakyness with selection and copying which **might** occur if
  //    the textarea element is not visible.
  //
  // The likelihood is the element won't even render, not even a
  // flash, so some of these are just precautions. However in
  // Internet Explorer the element is visible whilst the popup
  // box asking the user for permission for the web page to
  // copy to the clipboard.
  //

  // Place in top-left corner of screen regardless of scroll position.
  textArea.style.position = 'fixed';
  textArea.style.top = 0;
  textArea.style.left = 0;

  // Ensure it has a small width and height. Setting to 1px / 1em
  // doesn't work as this gives a negative w/h on some browsers.
  textArea.style.width = '2em';
  textArea.style.height = '2em';

  // We don't need padding, reducing the size if it does flash render.
  textArea.style.padding = 0;

  // Clean up any borders.
  textArea.style.border = 'none';
  textArea.style.outline = 'none';
  textArea.style.boxShadow = 'none';

  // Avoid flash of white box if rendered for any reason.
  textArea.style.background = 'transparent';


  textArea.value = text;

  document.body.appendChild(textArea);
  textArea.focus();
  textArea.select();

  try {
    var successful = document.execCommand('copy');
    var msg = successful ? 'successful' : 'unsuccessful';
    console.log('Copying text command was ' + msg);
  } catch (err) {
    console.log('Oops, unable to copy');
  }

  document.body.removeChild(textArea);
}


var copyBobBtn = document.querySelector('.js-copy-bob-btn'),
  copyJaneBtn = document.querySelector('.js-copy-jane-btn');

copyBobBtn.addEventListener('click', function(event) {
  copyTextToClipboard('Bob');
});


copyJaneBtn.addEventListener('click', function(event) {
  copyTextToClipboard('Jane');
});
<div style="display:inline-block; vertical-align:top;">
  <button class="js-copy-bob-btn">Set clipboard to BOB</button><br /><br />
  <button class="js-copy-jane-btn">Set clipboard to JANE</button>
</div>
<div style="display:inline-block;">
  <textarea class="js-test-textarea" cols="35" rows="4">Try pasting into here to see what you have on your clipboard:

  </textarea>
</div>

Додаткові нотатки

Працює лише в тому випадку, якщо користувач вживає дій

Усі document.execCommand('copy')дзвінки повинні відбуватися як безпосередній результат дії користувача, наприклад, обробник подій клацання. Це міра запобігти возитися з буфера обміну користувача, коли він цього не очікує.

Дивіться публікацію розробників Google тут для отримання додаткової інформації.

Буфер обміну API

Зверніть увагу, що повну специфікацію API буфера обміну можна знайти тут: https://w3c.github.io/clipboard-apis/

Це підтримується?

  • document.queryCommandSupported('copy')повинен повернутися, trueякщо команда "підтримується браузером".
  • і document.queryCommandEnabled('copy')повернутися, trueякщо document.execCommand('copy')заповіт буде успішний, якщо його зараз зателефонують. Перевірка на те, щоб команда була викликана з потоку, ініційованого користувачем, і інші вимоги виконуються.

Однак, як приклад проблем із сумісністю браузера, Google Chrome з ~ квітня по ~ жовтня 2015 року повертався лише trueз того document.queryCommandSupported('copy')випадку, якщо команда була викликана з ініційованого користувачем потоку.

Зверніть увагу на деталі сумісності нижче.

Деталі сумісності браузера

У той час як простий дзвінок, document.execCommand('copy')перетворений в try/ catchблок, викликаний в результаті натискання користувача, отримає максимальну сумісність, використовуйте наступні умови:

Будь-який виклик document.execCommand, document.queryCommandSupportedабо document.queryCommandEnabledповинен бути загорнутий в try/ catchблоці.

Різні реалізації браузера та версії браузера викидають різні типи винятків, коли викликаються замість повернення false.

Різні реалізації браузера все ще знаходяться в потоці, а API буфера обміну все ще знаходиться в чернеті, тому не забудьте зробити тестування.


41
як скопіювати безпосередньо зі змінних даних .ie var str = "word";:?
jscripter

10
@BubuDaba Створіть манекен, прихований за <textarea>допомогою JS, додайте його до нього document.body, встановіть його значення змінної та використовуйте його в темпі copyTextarea, а потім видаліть його відразу після копіювання вмісту.
SeinopSys

3
Чи є щось для Safari чи якісь показники того, що він буде реалізований у Safari?
www139

3
Єдина версія, яку я знайшов, яка працює у всіх браузерах. Я виявив, що при використанні цього в Boostrap Modal мені довелося додати текстову область до модальної. Я б дав +1000, якби міг за ваше рішення !!! ДЯКУЮ!
Патрік

3
@AyaSalama ключовим моментом є те, що дія "копіювання" не може відбутися, якщо вона не відображається в браузері, який користувач виконує. Користувач не зміг би здійснити дію, якщо елемент стилізований до "display: none", оскільки вони не зможуть його побачити і не взаємодіяти з ним.
Дін Тейлор

1256

Автоматичне копіювання у буфер обміну може бути небезпечним, тому більшість браузерів (крім IE) ускладнюють це. Особисто я використовую такий простий трюк:

function copyToClipboard(text) {
  window.prompt("Copy to clipboard: Ctrl+C, Enter", text);
}

Користувачеві представлено вікно підказки, де текст, який потрібно скопіювати, вже обраний. Тепер достатньо натиснути Ctrl+ Cі Enter(щоб закрити поле) - і вуаля!

Тепер операція копіювання буфера обміну - БЕЗКОШТОВНА, тому що користувач робить це вручну (але досить прямо). Звичайно, працює у всіх браузерах.

<button id="demo" onclick="copyToClipboard(document.getElementById('demo').innerHTML)">This is what I want to copy</button>

<script>
  function copyToClipboard(text) {
    window.prompt("Copy to clipboard: Ctrl+C, Enter", text);
  }
</script>


91
Розумний, але це підтримує лише одну лінію.
Арам Кочарян

61
Незмінно змінити функцію "підказка" на спеціальний модальний модуль, суть хитрості полягає у використанні редагованого поля вмісту та попереднього вибору тексту, і щоб воно не порушувало користувальницький інтерфейс користувача, змушуючи користувача приймати дії самі. A ++
Jon z

110
досі не використовує JavaScript для копіювання в буфер обміну ^ _ ^
RozzA

23
Якщо ваш текст має понад 2000 символів, він буде усічений, але для менших зразків тексту він чудово працює
RasTheDestroyer

445
Дивно, що за це отримують 457 оновлень, але це не відповідає на питання: скопіюйте у буфер обміну в Javascript !
stevenvh

298

Наступний підхід працює в Chrome, Firefox, Internet Explorer та Edge, а також в останніх версіях Safari (підтримка копіювання додана у версії 10, яка вийшла у жовтні 2016 року).

  • Створіть текстову область та встановіть її вміст до тексту, який потрібно скопіювати у буфер обміну.
  • Додайте текстову область до DOM.
  • Виберіть текст у текстовій області.
  • Виклик document.execCommand ("копія")
  • Видаліть текстильну ділянку з дому.

Примітка: текстової області ви не побачите, оскільки вона додається та видаляється в межах одного синхронного виклику коду Javascript.

Деякі речі, на які слід звернути увагу, якщо ви реалізуєте це самостійно:

  • З міркувань безпеки це може зателефонувати лише з обробника подій, наприклад, клацання (Так само, як і при відкриванні вікон).
  • Під час першого оновлення буфера обміну Internet Explorer покаже діалогове вікно дозволу.
  • Internet Explorer і Edge будуть прокручуватися, коли текстова область зосереджена.
  • execCommand () може кинути в деяких випадках.
  • Нові рядки та вкладки можна проковтнути, якщо не використовувати текстову область. (Більшість статей, здається, рекомендують використовувати div)
  • Текстові області будуть видимі, коли відображатиметься діалогове вікно Internet Explorer, або потрібно приховати його, або використовувати специфічний API буфера обміну даних для Internet Explorer.
  • У системі Internet Explorer адміністратори можуть відключити API буфера обміну.

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

// Copies a string to the clipboard. Must be called from within an
// event handler such as click. May return false if it failed, but
// this is not always possible. Browser support for Chrome 43+,
// Firefox 42+, Safari 10+, Edge and Internet Explorer 10+.
// Internet Explorer: The clipboard feature may be disabled by
// an administrator. By default a prompt is shown the first
// time the clipboard is used (per session).
function copyToClipboard(text) {
    if (window.clipboardData && window.clipboardData.setData) {
        // Internet Explorer-specific code path to prevent textarea being shown while dialog is visible.
        return clipboardData.setData("Text", text);

    }
    else if (document.queryCommandSupported && document.queryCommandSupported("copy")) {
        var textarea = document.createElement("textarea");
        textarea.textContent = text;
        textarea.style.position = "fixed";  // Prevent scrolling to bottom of page in Microsoft Edge.
        document.body.appendChild(textarea);
        textarea.select();
        try {
            return document.execCommand("copy");  // Security exception may be thrown by some browsers.
        }
        catch (ex) {
            console.warn("Copy to clipboard failed.", ex);
            return false;
        }
        finally {
            document.body.removeChild(textarea);
        }
    }
}

https://jsfiddle.net/fx6a6n6x/


9
Хороша відповідь: перехресна підтримка браузера, поводження з помилками та очищення. На сьогоднішній день новою підтримкою queryCommandSupported, копіювання у буфер обміну тепер можливо в Javascript, і це повинна бути прийнята відповідь, а не незручне 'window.prompt ("Копіювати в буфер обміну: Ctrl + C, Enter", текст) ". window.clipboardData підтримується в IE9, тому вам слід додати IE9 у список підтримки браузера, і я думаю, можливо IE8 і попередній також, але потрібно перевірити.
user627283

Так. IE 8/9 Має бути гаразд. Наш додаток не підтримує їх. Тому я не проходив тестування. IE припиняє підтримку в січні, тому я не надто метушився. Сподіваємось, незабаром підтримка Safari приїде. Я впевнений, що це на їх радарі.
Грег Лоу

4
@SantiagoCorredoira: У 2016 році це заслуговує на прийняття відповіді. Будь ласка, подумайте про перепризначення BGT (великої зеленої галочки).
Лоуренс Дол

3
@Noitidart I Протестований, і він ідеально підходить для браузера firefox 54, chrome 60 та краю, навіть якщо фокус відсутній у html-документі, помилка, яку ви маєте, мабуть, характерна для версії FF 55
Tosin John

2
@Noitidart Тут все ще чудово працює, зосередившись на інструментах розробників, це не зупинило. І до речі, що робитиме звичайний користувач веб-додатків на інструментах для розробників
Tosin John

97

Ось мій взяти на себе цей ...

function copy(text) {
    var input = document.createElement('input');
    input.setAttribute('value', text);
    document.body.appendChild(input);
    input.select();
    var result = document.execCommand('copy');
    document.body.removeChild(input);
    return result;
 }

@korayem: Зауважте, що використання html- inputполя не поважатиме розривів рядків, \nі будь-який текст буде вирівняно в один рядок.

Як згадував @nikksan у коментарях, використання textareaвиправить проблему наступним чином:

function copy(text) {
    var input = document.createElement('textarea');
    input.innerHTML = text;
    document.body.appendChild(input);
    input.select();
    var result = document.execCommand('copy');
    document.body.removeChild(input);
    return result;
}

@nikksan як скопіювати рядок \n?
софт-03

2
@ sof-03 використовуйте textarea замість введення та додайте \r\nдля перерви рядка
nikksan

1
Не працює в Microsoft Edge 42.17134.1.0 на Win10x64
Honsa Stunna

3
Я скопіював вашу відповідь. Він працює в хромі, і це все, що мені потрібно.
user875234

Це найпростіше рішення, яке працює з Firefox v68.0.2 (64-розрядний).
Ар’я

88

Якщо ви хочете по-справжньому простого рішення (на інтеграцію потрібно менше 5 хвилин) і добре виглядає прямо з коробки, тоді Clippy - це приємна альтернатива деяким більш складним рішенням.

Це написав співзасновник GitHub. Приклад вставного коду Flash нижче:

<object
   classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000"
   width="110"
   height="14"
   id="clippy">
  <param name="movie" value="/flash/clippy.swf"/>
  <param name="allowScriptAccess" value="always"/>
  <param name="quality" value="high"/>
  <param name="scale" value="noscale"/>
  <param NAME="FlashVars" value="text=#{text}"/>
  <param name="bgcolor" value="#{bgcolor}"/>
  <embed
     src="/flash/clippy.swf"
     width="110"
     height="14"
     name="clippy"
     quality="high"
     allowScriptAccess="always"
     type="application/x-shockwave-flash"
     pluginspage="http://www.macromedia.com/go/getflashplayer"
     FlashVars="text=#{text}"
     bgcolor="#{bgcolor}"/>
</object>

Не забудьте замінити #{text}текст, який потрібно скопіювати, і #{bgcolor}кольором.


12
Для всіх, хто цікавиться, перевірте, чи Clippy використовується на GitHub при копіюванні URL-адреси для репо.
Радек

66
FYI, використання Clippy на GitHub було замінено ZeroClipboard.
Джеймс М. Грін

219
ОП хотіло рішення в JavaScript. Не спалах.
MT.

21
@MT, під "JavaScript" деякі люди означають "клієнт браузера", тому, хоча лише JS може бути вимогою, багато людей, які отримують шанс на цю відповідь, дійсно шукають JS-або-іншого, який широко підтримується- клієнт-тех. Flash не стосується всіх платформ, але для такої польської функції, як підтримка буфера обміну, варто додати, якщо вона покращить UX над діалоговим вікном, що з’являється (що, безумовно, робить).
Дейв Допсон

13
В даний час покладатися на Flash означає, що речі не працюють для відсотка відвідувачів сайту, що неприпустимо майже для всіх, хто займається веб-розробкою.
jinglesthula

86

Читання та зміна буфера обміну з веб-сторінки викликає занепокоєння щодо безпеки та конфіденційності. Однак в Internet Explorer це можна зробити. Я знайшов цей приклад фрагменту :

    <script type="text/javascript">
        function select_all(obj) {
            var text_val=eval(obj);
            text_val.focus();
            text_val.select();
            r = text_val.createTextRange();
            if (!r.execCommand) return; // feature detection
            r.execCommand('copy');
        }
    </script>
    <input value="http://www.sajithmr.com"
     onclick="select_all(this)" name="url" type="text" />


7
Використання Flash для простої операції з копіюванням здається непосильним, радий, що був чистий спосіб JS зробити це. А оскільки ми в корпоративному середовищі. IE просто чудово. Дякую Банді!
Едді

5
PLZ поясніть, що execCommand(\\’copy\\’);робить, якщо не копіювати в буфер обміну для IE? @mrBorna
RozzA

20
Не використовуйте, if(!document.all)але if(!r.execCommand)щоб хтось інший не реалізував це! Document.all до цього абсолютно не стосується.
m93a

1
Людина, це те, що я люблю простий і чистий код, він працює майже назавжди з незначним обслуговуванням. Це зробив це для мене, це прекрасно працює.
Самуель Рамзан

1
не працює в останніх хромах, Firefox або MS Edge :(
Джонатан Марзулло

69

Нещодавно я написав технічну публікацію в блозі з цієї самої проблеми (я працюю в Lucidchart, і нещодавно ми зробили капітальний ремонт нашого буфера обміну).

Копіювати звичайний текст у буфер обміну порівняно просто, якщо припустити, що ви хочете це зробити під час події копіювання системи (користувач натискає CtrlCабо використовує меню браузера).

var isIe = (navigator.userAgent.toLowerCase().indexOf("msie") != -1 
           || navigator.userAgent.toLowerCase().indexOf("trident") != -1);

document.addEventListener('copy', function(e) {
    var textToPutOnClipboard = "This is some text";
    if (isIe) {
        window.clipboardData.setData('Text', textToPutOnClipboard);    
    } else {
        e.clipboardData.setData('text/plain', textToPutOnClipboard);
    }
    e.preventDefault();
});

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

Крім цього, існують деякі варіанти браузера за браузером.

Це найпростіший в IE, де ви можете отримати доступ до об’єкта clipboardData в будь-який час з JavaScript через:

window.clipboardData

(При спробі зробити це за межами системної події вирізати, скопіювати або вставити, проте IE запропонує користувачеві надати дозвіл на буфер обміну веб-додатків.)

У Chrome ви можете створити розширення для Chrome, яке надасть вам доступ до буфера обміну (це ми робимо для Lucidchart). Тоді для користувачів із встановленим розширенням просто потрібно самостійно запустити системну подію:

document.execCommand('copy');

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


2
Не згадується у публікації блогу (сподіваюся оновити її найближчим часом), це можливість запускати вирізання та копіювання за допомогою execCommand. Це підтримується в IE10 +, Chrome 43+ та Opera29 +. Про це читайте тут. updates.html5rocks.com/2015/04/cut-and-copy-commands
Річард Шурц

Проблема в цьому полягає в тому, що він викрадає інші нормальні події копіювання.
Брок Адамс

NB! Нюхає цей веб-переглядач BAD. Виконайте нюхання. Ви ускладнюєте оновлення IE.
odinho - Вельмонт

51

clipboard.js - це невелика утиліта, що не Flash, яка дозволяє копіювати текстові чи 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 .

Примітка . Зараз це застаріло. Переїзд сюди .


Ця бібліотека використовується angular.io для своєї подорожі Hero та резервного копіювання у витонченому режимі для браузера, який не підтримує execCommand, відображаючи попередньо вибраний текст, який користувач повинен просто скопіювати.
Джон-Філіп

1
Виглядає, що або clipboard.js було замінено, або роздвоєне, але воно, здається, живе і активно підтримується за адресою npmjs.com/package/clipboard
Жоао

35

ZeroClipboard - це найкраще крос-браузерне рішення, яке я знайшов:

<div id="copy" data-clipboard-text="Copy Me!">Click to copy</div>    
<script src="ZeroClipboard.js"></script>
<script>
  var clip = new ZeroClipboard( document.getElementById('copy') );
</script>

Якщо вам потрібна підтримка без флеш-пам’яті для iOS, ви просто додасте резервне:

clip.on( 'noflash', function ( client, args ) {
    $("#copy").click(function(){            
        var txt = $(this).attr('data-clipboard-text');
        prompt ("Copy link, then click OK.", txt);
    });
});  

http://zeroclipboard.org/

https://github.com/zeroclipboard/ZeroClipboard


25
крос-браузер із Flash? не працює в iOS та Android 4.4
Raptor

1
Дивіться оновлену відповідь. Це дозволяє менше кроків для користувачів флеш-пам’яті та відступ для всіх інших.
Джастін

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

2
Існує проста версія gist.github.com/JamesMGreene/8698897 , тобто 20K, яка не має всіх дзвіночків у версії 74k. Ні одна дуже велика. Напевно, більшість користувачів гаразд із зайвими мілісекундами, що завантажуваний файл 74 кб або 20 кб займе, тому копіювати / вставляти - це один клік замість двох.
Джастін

@Justin Я просто не можу змусити його працювати локально, навіть якщо я копіюю і вставляю приклади (я вношу мінімальні зміни, наприклад, значення srcтегів сценарію). Я вважаю, що їх документація є досить, але неефективною.
Gui Imamura

29

У 2018 році ось як можна це зробити:

async copySomething(text?) {
  try {
    const toCopy = text || location.href;
    await navigator.clipboard.writeText(toCopy);
    console.log('Text or Page URL copied');
  }
  catch (err) {
    console.error('Failed to copy: ', err);
  }
}

Він використовується в моєму кутовому 6+ коді так:

<button mat-menu-item (click)="copySomething()">
    <span>Copy link</span>
</button>

Якщо я передаю рядок, він копіює її. Якщо нічого, воно копіює URL сторінки.

Також можна зробити більше гімнастики до буфера обміну. Дивіться більше інформації тут:

Розблокування доступу до буфера обміну


ви пов’язані з localhost
Джо Уорнер

2
Зауважте, що це не працює в Safari (версія 11.1.2)
arjun27

1
@ arjun27 Добре сподіваємось, колись Apple наздожене. Хоча цей caniuse.com/#feat=clipboard показує, що вищезгадана версія, яку ви згадали, частково підтримується.
Хофі

2
Я отримую обидві функції readText, writeText Обіцяння у відхиленому стані
ramin

3
Відповідно до наданого посилання, "navigator.clipboard підтримується лише для сторінок, що
надходять

26

З одного з проектів, над якими я працював, плагін для копіювання в буфер jQuery, який використовує бібліотеку Zero Clipboard .

Це простіше у використанні, ніж рідний плагін Zero Clipboard, якщо ви великий користувач jQuery.


6
92kb - це не так вже й багато, він працює швидко і ви можете використовувати text()замість цього, innerHTML()якщо вам подобається ..
RozzA

17
@John: innerHTMLвже давно підтримується крос-браузер. Тільки тому, що Microsoft спочатку придумала цю ідею, вона не робить її ненадійною або власною. Він також остаточно додається до офіційної специфікації (після того, як кожен великий постачальник браузера вже додав підтримку ... зітхання ).
Джеймс М. Грін

19
@John Ви скаржитеся на те, що jQuery недостатньо JavaScript у відповіді, що використовує Flash;)
Макс Нанасі

4
innerHTML краще, ніж альтернативи в більшості випадків. Геть свого високого коня! Це швидше, ефективніше і не потребує повторного відображення сторінки.
Орбіта Ідея

4
@RozzA 92KBдійсно великий. Поки LTE не дозріває, GPRS є стандартом мобільних даних у світі , і він починається з 1 KB/s. Зробіть математику самостійно.
Тіно

23

Оскільки Chrome 42+ та Firefox 41+ тепер підтримують команду document.execCommand ("копіювати") . Таким чином , я створив кілька функцій для можливості крос-браузерної копіювання в буфер обміну , використовуючи поєднання старого відповіді Тіма Дауна і відповідь Google розробника :

function selectElementContents(el) {
    // Copy textarea, pre, div, etc.
    if (document.body.createTextRange) {
        // IE
        var textRange = document.body.createTextRange();
        textRange.moveToElementText(el);
        textRange.select();
        textRange.execCommand("Copy");
    } 
    else if (window.getSelection && document.createRange) {
        // Non-Internet Explorer
        var range = document.createRange();
        range.selectNodeContents(el);
        var sel = window.getSelection();
        sel.removeAllRanges();
        sel.addRange(range);
        try {
            var successful = document.execCommand('copy');
            var msg = successful ? 'successful' : 'unsuccessful';
            console.log('Copy command was ' + msg);
        }
        catch (err) {
            console.log('Oops, unable to copy');
        }
    }
} // end function selectElementContents(el)

function make_copy_button(el) {
    var copy_btn = document.createElement('input');
    copy_btn.type = "button";
    el.parentNode.insertBefore(copy_btn, el.nextSibling);
    copy_btn.onclick = function() {
        selectElementContents(el);
    };

    if (document.queryCommandSupported("copy") || parseInt(navigator.userAgent.match(/Chrom(e|ium)\/([0-9]+)\./)[2]) >= 42) {
        // Copy works with Internet Explorer 4+, Chrome 42+, Firefox 41+, Opera 29+
        copy_btn.value = "Copy to Clipboard";
    }
    else {
        // Select only for Safari and older Chrome, Firefox and Opera
        copy_btn.value = "Select All (then press Ctrl + C to Copy)";
    }
}
/* Note: document.queryCommandSupported("copy") should return "true" on browsers that support copy
    but there was a bug in Chrome versions 42 to 47 that makes it return "false".  So in those
    versions of Chrome feature detection does not work!
    See https://code.google.com/p/chromium/issues/detail?id=476508
*/

make_copy_button(document.getElementById("markup"));
<pre id="markup">
  Text that can be copied or selected with cross browser support.
</pre>


Дякуємо, що підсумували це! У вашому коді є невеликі помилки: ви двічі визначили змінну "діапазон" (var range = document.createRange ()).
Крістіан Енгель

1
Ви праві @ChristianEngel. Я видалив другу. Я не знаю, як це потрапило туди.
Джефф Бейкер

23

Я використовую це дуже успішно ( без jQuery чи будь-якого іншого фреймворку).

function copyToClp(txt){
    txt = document.createTextNode(txt);
    var m = document;
    var w = window;
    var b = m.body;
    b.appendChild(txt);
    if (b.createTextRange) {
        var d = b.createTextRange();
        d.moveToElementText(txt);
        d.select();
        m.execCommand('copy');
    } 
    else {
        var d = m.createRange();
        var g = w.getSelection;
        d.selectNodeContents(txt);
        g().removeAllRanges();
        g().addRange(d);
        m.execCommand('copy');
        g().removeAllRanges();
    }
    txt.remove();
}

Увага

Вкладки перетворюються на пробіли (принаймні в Chrome).


Прогалини не вистачає в цьому підході
Бикрам

1
Хром. вкладки перетворені в один простір
Bikram

22

Я знайшов таке рішення:

При обробці ключем обробник створює тег "pre". Ми встановлюємо вміст для копіювання в цей тег, потім робимо виділення на цей тег і повертаємо true у обробник. Це викликає стандартний обробник хрому та копіює вибраний текст.

І якщо вам це потрібно, вам може бути встановлено час очікування функції відновлення попереднього вибору. Моя реалізація на Mootools:

   function EnybyClipboard() {
     this.saveSelection = false;
     this.callback = false;
     this.pastedText = false;

     this.restoreSelection = function() {
       if (this.saveSelection) {
         window.getSelection().removeAllRanges();
         for (var i = 0; i < this.saveSelection.length; i++) {
           window.getSelection().addRange(this.saveSelection[i]);
         }
         this.saveSelection = false;
       }
     };

     this.copyText = function(text) {
       var div = $('special_copy');
       if (!div) {
         div = new Element('pre', {
           'id': 'special_copy',
           'style': 'opacity: 0;position: absolute;top: -10000px;right: 0;'
         });
         div.injectInside(document.body);
       }
       div.set('text', text);
       if (document.createRange) {
         var rng = document.createRange();
         rng.selectNodeContents(div);
         this.saveSelection = [];
         var selection = window.getSelection();
         for (var i = 0; i < selection.rangeCount; i++) {
           this.saveSelection[i] = selection.getRangeAt(i);
         }
         window.getSelection().removeAllRanges();
         window.getSelection().addRange(rng);
         setTimeout(this.restoreSelection.bind(this), 100);
       } else return alert('Copy not work. :(');
     };

     this.getPastedText = function() {
       if (!this.pastedText) alert('Nothing to paste. :(');
       return this.pastedText;
     };

     this.pasteText = function(callback) {
       var div = $('special_paste');
       if (!div) {
         div = new Element('textarea', {
           'id': 'special_paste',
           'style': 'opacity: 0;position: absolute;top: -10000px;right: 0;'
         });
         div.injectInside(document.body);
         div.addEvent('keyup', function() {
           if (this.callback) {
             this.pastedText = $('special_paste').get('value');
             this.callback.call(null, this.pastedText);
             this.callback = false;
             this.pastedText = false;
             setTimeout(this.restoreSelection.bind(this), 100);
           }
         }.bind(this));
       }
       div.set('value', '');
       if (document.createRange) {
         var rng = document.createRange();
         rng.selectNodeContents(div);
         this.saveSelection = [];
         var selection = window.getSelection();
         for (var i = 0; i < selection.rangeCount; i++) {
           this.saveSelection[i] = selection.getRangeAt(i);
         }
         window.getSelection().removeAllRanges();
         window.getSelection().addRange(rng);
         div.focus();
         this.callback = callback;
       } else return alert('Fail to paste. :(');
     };
   }

Використання:

enyby_clip = new EnybyClipboard(); //init 

enyby_clip.copyText('some_text'); // place this in CTRL+C handler and return true;

enyby_clip.pasteText(function callback(pasted_text) {
        alert(pasted_text);
}); // place this in CTRL+V handler and return true;

На пасті він створює текстові області і працює так само.

PS це рішення може бути використане для створення повністю крос-браузерного рішення без спалаху. Він працює у FF та Chrome.


2
Хтось пробував це? Здається, це чудово, якщо це дійсно працює на різних браузерах!
Майкл

1
jsfiddle.net/H2FHC Demo: fiddle.jshell.net/H2FHC/show Будь ласка, відкрийте її та натисніть Ctrl + V або Ctrl + C. У FF 19,0 вилки відмінно. У Chrome також 25.0.1364.97 м. Опера 12.14 - ОК. Safari 5.1.7 для Windows - Гаразд. IE - невдача.
Enyby

Для IE потрібно запустити фокус на елементі всередині сторінки. Дивіться fiddle.jshell.net/H2FHC/3/show та fiddle.jshell.net/H2FHC/3 Працював у IE 9/10. IE 6/7 потребує процесу створення вибору іншим способом, оскільки document.createRange не підтримується.
Enyby

21

Інші методи скопіюють звичайний текст у буфер обміну. Щоб скопіювати HTML (тобто ви можете вставити результати в редактор WSIWYG), ви можете зробити наступне в IE ТОЛЬКО . Це принципово відрізняється від інших методів, оскільки браузер насправді наочно вибирає вміст.

// create an editable DIV and append the HTML content you want copied
var editableDiv = document.createElement("div");
with (editableDiv) {
    contentEditable = true;
}     
editableDiv.appendChild(someContentElement);          

// select the editable content and copy it to the clipboard
var r = document.body.createTextRange();
r.moveToElementText(editableDiv);
r.select();  
r.execCommand("Copy");

// deselect, so the browser doesn't leave the element visibly selected
r.moveToElementText(someHiddenDiv);
r.select();   

докладніше повний HTML рішення тут stackoverflow.com/questions/34191780 / ...
kofifus

21

Я зібрав те, що вважаю найкращим.

  • Використовує cssText, щоб уникнути винятків в Internet Explorer на відміну від стилю безпосередньо.
  • Відновлює вибір, якщо такий був
  • Встановлюється лише для читання, щоб клавіатура не з’являлася на мобільних пристроях
  • Має вирішення проблеми для iOS, щоб вона фактично працювала, як зазвичай блокує execCommand.

Ось:

const copyToClipboard = (function initClipboardText() {
  const textarea = document.createElement('textarea');

  // Move it off screen.
  textarea.style.cssText = 'position: absolute; left: -99999em';

  // Set to readonly to prevent mobile devices opening a keyboard when
  // text is .select()'ed.
  textarea.setAttribute('readonly', true);

  document.body.appendChild(textarea);

  return function setClipboardText(text) {
    textarea.value = text;

    // Check if there is any content selected previously.
    const selected = document.getSelection().rangeCount > 0 ?
      document.getSelection().getRangeAt(0) : false;

    // iOS Safari blocks programmtic execCommand copying normally, without this hack.
    // /programming/34045777/copy-to-clipboard-using-javascript-in-ios
    if (navigator.userAgent.match(/ipad|ipod|iphone/i)) {
      const editable = textarea.contentEditable;
      textarea.contentEditable = true;
      const range = document.createRange();
      range.selectNodeContents(textarea);
      const sel = window.getSelection();
      sel.removeAllRanges();
      sel.addRange(range);
      textarea.setSelectionRange(0, 999999);
      textarea.contentEditable = editable;
    }
    else {
      textarea.select();
    }

    try {
      const result = document.execCommand('copy');

      // Restore previous selection.
      if (selected) {
        document.getSelection().removeAllRanges();
        document.getSelection().addRange(selected);
      }

      return result;
    }
    catch (err) {
      console.error(err);
      return false;
    }
  };
})();

Використання: copyToClipboard('some text')


13

Станом на Flash 10, ви можете копіювати в буфер обміну лише тоді, коли дія походить від взаємодії користувача з об'єктом Flash. ( Прочитайте відповідний розділ з оголошення Flash Adobe 10 )

Рішення полягає в надмірному спалаху об'єкта над кнопкою Копіювати або будь-який елемент, який ініціює копію. В даний час Zero буфер обміну є найкращою бібліотекою з цією реалізацією. Досвідчені розробники Flash можуть просто захотіти створити власну бібліотеку.


12

  <!DOCTYPE html>

  <style>
    #t {
      width: 1px
      height: 1px
      border: none
    }
    #t:focus {
      outline: none
    }
  </style>

  <script>
    function copy(text) {
      var t = document.getElementById('t')
      t.innerHTML = text
      t.select()
      try {
        var successful = document.execCommand('copy')
        var msg = successful ? 'successfully' : 'unsuccessfully'
        console.log('text coppied ' + msg)
      } catch (err) {
        console.log('Unable to copy text')
      }
      t.innerHTML = ''
    }
  </script>

  <textarea id=t></textarea>

  <button onclick="copy('hello world')">
    Click me
  </button>


Найкраща відповідь: D, ви можете покращити це приблизно так: #t {позиція: абсолютна; зліва: 0; z-індекс: -900; ширина: 0px; висота: 0px; межа: немає; } Отже, це буде повністю приховано! Але дуже дякую брате!
Федеріко Наваррете

#t {resize: none;}
SmartManoj

Пояснення було б в порядку.
Пітер Мортенсен

12

Я знайшов таке рішення:

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

jQuery('#copy').on('click', function () {
    copyToClipboard();
});

function copyToClipboard() {
    var target = jQuery('#hidden_text');

    // Make it visible, so can be focused
    target.attr('type', 'text');
    target.focus();
    // Select all the text
    target[0].setSelectionRange(0, target.val().length);

    // Copy the selection
    var succeed;
    try {
        succeed = document.execCommand("copy");
    }
    catch (e) {
        succeed = false;
    }

    // Hide input again
    target.attr('type', 'hidden');

    return succeed;
}

11

Скопіюйте текст із введення HTML у буфер обміну:

 function myFunction() {
   /* Get the text field */
   var copyText = document.getElementById("myInput");

   /* Select the text field */
   copyText.select();

   /* Copy the text inside the text field */
   document.execCommand("Copy");

   /* Alert the copied text */
   alert("Copied the text: " + copyText.value);
 }
 <!-- The text field -->
 <input type="text" value="Hello Friend" id="myInput">

 <!-- The button used to copy the text -->
<button onclick="myFunction()">Copy text</button>

Примітка . document.execCommand()Метод не підтримується в Internet Explorer 9 і новіших версіях.

Джерело : W3Schools - Скопіюйте текст у буфер обміну


11

Відповідей уже багато, однак люблю додати один (jQuery). Відмінно працює у будь-якому веб-переглядачі, навіть у мобільних (тобто, запитує про безпеку, але коли ви приймаєте це просто працює).

function appCopyToClipBoard(sText)
{
    var oText = false,
        bResult = false;
    try
    {
        oText = document.createElement("textarea");
        $(oText).addClass('clipboardCopier').val(sText).insertAfter('body').focus();
        oText.select();
        document.execCommand("Copy");
        bResult = true;
    }
    catch(e) {
    }

    $(oText).remove();
    return bResult;
}

У вашому коді:

if (!appCopyToClipBoard('Hai there! This is copied to the clipboard.'))
{
    alert('Sorry, copy to clipboard failed.');
}

9

Це трохи поєднання між іншими відповідями.

var copyToClipboard = function(textToCopy){
    $("body")
        .append($('<textarea name="fname" class="textToCopyInput"/>' )
        .val(textToCopy))
        .find(".textToCopyInput")
        .select();
      try {
        var successful = document.execCommand('copy');
        var msg = successful ? 'successful' : 'unsuccessful';
        alert('Text copied to clipboard!');
      } catch (err) {
          window.prompt("To copy the text to clipboard: Ctrl+C, Enter", textToCopy);
      }
     $(".textToCopyInput").remove();
}

Він використовує jQuery, але це, звичайно, не обов'язково. Ви можете змінити це, якщо хочете. Я просто мав jQuery в своєму розпорядженні. Ви також можете додати деякі CSS, щоб переконатися, що введення не відображається. Наприклад, щось на кшталт:

.textToCopyInput{opacity: 0; position: absolute;}

Або, звичайно, ви також могли б зробити деякі вбудовані стилі

.append($('<textarea name="fname" style="opacity: 0;  position: absolute;" class="textToCopyInput"/>' )

Як скопіювати безпосередньо зі змінних даних .ie: var str = "word"; ?

Змінна мсг не використовується
Voyager

Краще використовувати '<textarea class = "textToCopyInput" /> </textarea> "у випадку, якщо він textToCopyмістить\n
Voyager

8

У браузерах, крім IE, вам потрібно використовувати невеликий флеш-об’єкт для маніпулювання буфером обміну, наприклад


Зараз це застаріло ... ознайомтеся з пропозицією GvS
Mottie

6
Пропозиція GvS використовує флеш-фільм? Хіба це не та сама ідея?
TheEmirOfGroofunistan

8

У мене була така ж проблема зі створенням редагування власної сітки (щось на зразок Excel) та сумісністю з Excel. Мені довелося підтримувати вибір декількох комірок, копіювання та вставлення.

Рішення: створіть текстову область, куди ви будете вставляти дані для копіювання користувача (для мене, коли користувач вибирає клітинки), встановіть фокус на ньому (наприклад, при натисканні користувача Ctrl) та виберіть весь текст.

Отже, коли користувач натискає Ctrl+ Cвін / вона отримує скопійовані клітини, які він / вона вибрав. Після тестування просто змініть розмір текстової області до одного пікселя (я не перевіряв, чи буде він працювати на дисплеї: немає). Він добре працює у всіх браузерах, і він прозорий для користувача.

Вставка - ви можете зробити так само, як це (відрізняється від вашої цілі) - тримайте упор на textarea і ловіть події вставки, використовуючи onpaste (у своєму проекті я використовую textareas у клітинках для редагування).

Я не можу вставити приклад (комерційний проект), але ви розумієте.


7

Я використав clipboard.js.

Ми можемо отримати це в npm:

npm install clipboard --save

А також на Bower

bower install clipboard --save

Приклади використання та приклади наведено на веб-сторінці https://zenorocha.github.io/clipboard.js/ .


Я побоювався, що він не сумісний з динамічним контентом, але це ;-) Я думаю, що це краще рішення ЗАРАЗ, ніж старий 2008 року.
BENARD Patrick


6

Це розширення відповіді @ Chase, з тим перевагою, що вона буде працювати для елементів IMAGE і TABLE, а не лише для DIV на IE9.

if (document.createRange) {
    // IE9 and modern browsers
    var r = document.createRange();
    r.setStartBefore(to_copy);
    r.setEndAfter(to_copy);
    r.selectNode(to_copy);
    var sel = window.getSelection();
    sel.addRange(r);
    document.execCommand('Copy');  // does nothing on FF
} else {
    // IE 8 and earlier.  This stuff won't work on IE9.
    // (unless forced into a backward compatibility mode,
    // or selecting plain divs, not img or table). 
    var r = document.body.createTextRange();
    r.moveToElementText(to_copy);
    r.select()
    r.execCommand('Copy');
}

5

Здається, я неправильно прочитав питання, але для довідки ви можете витягнути діапазон DOM (не в буфер обміну; сумісний з усіма сучасними браузерами) та поєднати його з подіями oncopy та onpaste та onbeforepaste, щоб отримати поведінку в буфері обміну. Ось код для цього:

function clipBoard(sCommand) {
  var oRange=contentDocument.createRange();
  oRange.setStart(startNode, startOffset);
  oRange.setEnd(endNode, endOffset);
/* This is where the actual selection happens.
in the above, startNode and endNode are dom nodes defining the beginning 
and end of the "selection" respectively. startOffset and endOffset are 
constants that are defined as follows:

END_TO_END: 2
END_TO_START: 3
NODE_AFTER: 1
NODE_BEFORE: 0
NODE_BEFORE_AND_AFTER: 2
NODE_INSIDE: 3
START_TO_END: 1
START_TO_START: 0

and would be used like oRange.START_TO_END */
      switch(sCommand) {
    case "cut":
          this.oFragment=oRange.extractContents();
      oRange.collapse();
      break;
    case "copy":
      this.oFragment=oRange.cloneContents();
      break;
    case "paste":
      oRange.deleteContents();
      var cloneFragment=this.oFragment.cloneNode(true)
      oRange.insertNode(cloneFragment);
      oRange.collapse();
      break;
  }
}

1
насправді я виправив код. Він працює у всіх браузерах, але насправді не копіює у буфер обміну. Просто витягує (скорочує), клонує (копіює) вміст через змінні. Здається, я забув використання.
mrBorna

5

Моє ліжко. Це працює лише в IE.

Ось ще один спосіб копіювання тексту:

<p>
    <a onclick="window.clipboardData.setData('text', document.getElementById('Test').innerText);">Copy</a>
</p>

9
Це не працює в поточному Chrome (V31) або FireFox (v25). Помилка в тому, що window.clipboardДані не визначено. З іншого боку, він працює в IE9. Тож поки ви не переймаєтесь хорошими браузерами і хочете заблокувати свій сайт, використовуючи погані, це саме так можна зробити!
Ентоні

2
я не розумію, чому так багато дурних відповідей. w3schools.com/howto/tryit.asp?filename=tryhow_js_copy_clipboard
Martian2049

5

Це було єдине, що я коли-небудь працював, шукаючи різні способи в Інтернеті. Це безладна тема. Є багато рішень, розміщених по всьому світу, і більшість з них не працюють. Це працювало для мене:

ПРИМІТКА. Цей код працюватиме лише тоді, коли виконується як прямий синхронний код на щось на зразок методу "onClick". Якщо ви викликаєте асинхронну відповідь на Ajax або будь-яким іншим асинхронним способом, це не спрацює.

copyToClipboard(text) {
    var copyText = document.createElement("input");
    copyText.type = "text";
    document.body.appendChild(copyText);
    copyText.style = "display: inline; width: 1px;";
    copyText.value = text;
    copyText.focus();
    document.execCommand("SelectAll");
    document.execCommand("Copy");
    copyText.remove();
}

Я усвідомлюю, що цей код на мілісекунд помітно відобразить 1-піксельний компонент із широким розміром 1 пікселя, але вирішив не хвилюватися з цього приводу, що може вирішити інші, якщо справжня проблема.


5

Щоб скопіювати вибраний текст ("Текст для копіювання") у буфер обміну, створіть закладку (закладку браузера, яка виконує JavaScript) та виконайте її (натисніть на неї). Це створить тимчасову текстову область.

Код від GitHub:

https://gist.github.com/stefanmaric/2abf96c740191cda3bc7a8b0fc905a7d

(function (text) {
  var node = document.createElement('textarea');
  var selection = document.getSelection();

  node.textContent = text;
  document.body.appendChild(node);

  selection.removeAllRanges();
  node.select();
  document.execCommand('copy');

  selection.removeAllRanges();
  document.body.removeChild(node);
})('Text To Copy');
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.