Копировать в буфер обмена без Flash


90

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


Не нашел, искал то же самое. Хотел использовать Flash, поэтому удалил эту функцию перед созданием.
— eugeneK


1
Я сомневаюсь, что вы сможете сделать это в разных браузерах без использования FLASH. Но есть конкретное решение, которое может помочь вам получить решение zeroclipboard,
— Ракеш Санкар

Ракеш - ваше «конкретное решение» основано на Flash. Он не будет работать ни в одном браузере, который я использую.
— RobG

1
Метод @wizztjh в stackoverflow.com/questions/400212/… предназначен для стороны сайта, а не для стороны пользователя. @Rakesh zeroclipboard хорош, но я хочу найти метод полностью без Flash
— Black_Sun

Ответы:


31

Без вспышки это просто невозможно в большинстве браузеров. Буфер обмена пользователя является важным ресурсом, поскольку он может содержать такие вещи, как пароли или номера кредитных карт. Таким образом, браузеры по праву не разрешают Javascript доступ к нему (некоторые разрешают это с предупреждением, показанным, что пользователь подтвердил, или с подписанным кодом Javascript, но ни один из них не является кроссбраузерным).


21
Так что, возможно, страницы не должны иметь возможность читать из буфера обмена, но почему бы не писать в него? = /
— Ajedi32

5
Но тогда зачем позволять этому происходить через скрытую вспышку, которая не требует уведомлений и отзывов пользователей?
— Эрик Грейндж

3
@EricGrange: Потому что еще в середине 1990-х кто-то в Netscape решил, что по соображениям производительности плагины браузера будут родными двоичными файлами и, таким образом, смогут делать практически все что угодно. В то время онлайн-мир был очень простым местом, и безопасность не вызывала особого беспокойства.
— Майкл Боргвардт

4
Хотя этот ответ был правдой в 2011 году, браузеры прошли долгий путь в борьбе за уничтожение флэш-памяти. Пожалуйста, посмотрите мой ответ ниже.
— Hovis Biddle

25

Я пробовал флеш-решение, и оно мне тоже не понравилось. Слишком сложно и слишком медленно. Я создал текстовое поле, поместил в него данные и использовал поведение браузера «CTRL + C».

Часть javascript jQuery:

// catch the "ctrl" combination keydown
$.ctrl = function(key, callback, args) {
    $(document).keydown(function(e) {
        if(!args) args=[]; // IE barks when args is null
        if(e.keyCode == key && e.ctrlKey) {
            callback.apply(this, args);
            return false;
        }
    });
};

// put your data on the textarea and select all
var performCopy = function() {
    var textArea = $("#textArea1");
    textArea.text('PUT THE TEXT TO COPY HERE. CAN BE A FUNCTION.');
    textArea[0].focus();
    textArea[0].select();
};

// bind CTRL + C
$.ctrl('C'.charCodeAt(0), performCopy);

Часть HTML:
<textarea id="textArea1"></textarea>

Теперь поместите то, что вы хотите скопировать, в «РАЗМЕСТИТЕ ТЕКСТ ДЛЯ КОПИРОВАНИЯ ЗДЕСЬ. МОЖЕТ БЫТЬ ФУНКЦИЕЙ ». площадь. У меня отлично работает. Вам просто нужно составить одну комбинацию CTRL + C. Единственный недостаток заключается в том, что на вашем сайте будет отображаться уродливое текстовое поле. Если вы используете style = "display: none", решение для копирования работать не будет.


6
Кажется, что это только связывает функцию Ctrl + C с функцией javascript, а не помещает данные в буфер обмена ОС.
— Ishmael

конечно, это идея. Сделайте копию для браузера. Здесь есть похожее решение: knockoutjs.com/examples/clickCounter.html . При двойном щелчке они создают текстовую область с помощью javascript с содержимым.
— Хулио Сайто

у меня не сработало на osx, поэтому я добавил e.metaKeyв сравнение нажатия клавиш , но по какой-то причине действие копирования не запускается. См. Эту скрипку: jsfiddle.net/gableroux/gta67/1
— GabLeRoux,

2
@GabLeRoux функция копирования в сафари доступна только при выделении текста. Раньше это работало, но недавнее обновление сафари остановило его. Кажется, что выделение текста после вызова события нажатия клавиши больше не сокращает его в этом браузере. Однако все еще отлично работает в хроме. Ну что ж, возможно, придется вернуться к использованию вспышки только для этого браузера ....
— Аран Малхолланд

Как это. Если вы не можете скрыть (по какой-либо причине) элемент, который вам не нужен, вы всегда можете поместить его подальше от начала, например padding-bottom: -1000.
— m3nda


10

Наконец-то он здесь! (Если вы не поддерживаете Safari или IE8 ... -_-)

Теперь вы можете обрабатывать действия с буфером обмена без Flash. Вот соответствующая документация:

https://developer.mozilla.org/en-US/docs/Web/API/Document/execCommand

https://developers.google.com/web/updates/2015/04/cut-and-copy-commands?hl=en

https://msdn.microsoft.com/en-us/library/hh801227%28v=vs.85%29.aspx#copy


3

С нетерпением ожидая поддержки Xbrowser API буфера обмена ...


Это будет прекрасно работать в Chrome, Firefox, Edge, IE.

IE только один раз предложит пользователю получить доступ к буферу обмена.
Safari (5,1 на момент написания статьи) не поддерживает execCommandдляcopy/cut

/**
 * CLIPBOARD
 * https://stackoverflow.com/a/33337109/383904
 */
const clip = e => {
  e.preventDefault();
  
  const cont = e.target.innerHTML;
  const area = document.createElement("textarea");
  
  area.value = e.target.innerHTML; // or use .textContent
  document.body.appendChild(area);
  area.select();
 
  if(document.execCommand('copy')) console.log("Copied to clipboard");
  else prompt("Copy to clipboard:\nSelect, Cmd+C, Enter", cont); // Saf, Other
  
  area.remove();
};


[...document.querySelectorAll(".clip")].forEach(el => 
  el.addEventListener("click", clip)
);
<a class="clip" href="#!">Click an item to copy</a><br>
<a class="clip" href="#!"><i>Lorem</i></a><br>
<a class="clip" href="#!"><b>IPSUM</b></a><br>

<textarea placeholder="Paste here to test"></textarea>

Все браузеры (кроме Firefox , который способен обрабатывать только мимику типа "plain/text", насколько я проверил) еще не реализованы в Clipboard API . То есть, пытаясь прочитать событие буфера обмена в Chrome, используя

var clipboardEvent = new ClipboardEvent("copy", {
        dataType: "plain/text",
        data: "Text to be sent to clipboard"
});

throws: Uncaught TypeError: Незаконный конструктор

Лучший ресурс о невероятном беспорядке, который происходит между браузерами и буфером обмена, можно увидеть здесь (caniuse.com) (→ Следите за комментариями в разделе «Примечания» ).
MDN говорит, что базовая поддержка - «(ДА)» для всех браузеров, что неточно, потому что можно было бы ожидать, что хотя бы API вообще будет работать.


1

Вы можете использовать буфер обмена, локальный для HTML-страницы. Это позволяет копировать / вырезать / вставлять контент ВНУТРИ HTML-страницы, но не из / в сторонние приложения или между двумя HTML-страницами.

Вот как вы можете написать настраиваемую функцию для этого (проверено в Chrome и Firefox):

Вот FIDDLE , демонстрирующий, как это можно сделать.

Я также вставлю сюда скрипку для справки.


HTML

<p id="textToCopy">This is the text to be copied</p>
<input id="inputNode" type="text" placeholder="Copied text will be pasted here" /> <br/>

<a href="#" onclick="cb.copy()">copy</a>
<a href="#" onclick="cb.cut()">cut</a>
<a href="#" onclick="cb.paste()">paste</a>

JS

function Clipboard() {
    /* Here we're hardcoding the range of the copy
    and paste. Change to achieve desire behavior. You can
    get the range for a user selection using
    window.getSelection or document.selection on Opera*/
    this.oRange = document.createRange();
    var textNode = document.getElementById("textToCopy");
    var inputNode = document.getElementById("inputNode");
    this.oRange.setStart(textNode,0);
    this.oRange.setEndAfter(textNode);
    /* --------------------------------- */
}

Clipboard.prototype.copy = function() {
    this.oFragment= this.oRange.cloneContents();
};

Clipboard.prototype.cut = function() {
    this.oFragment = this.oRange.extractContents();
};

Clipboard.prototype.paste = function() {
    var cloneFragment=this.oFragment.cloneNode(true)
    inputNode.value = cloneFragment.textContent;
};

window.cb = new Clipboard();

Привет, mtBrona. Есть ли способ прикрепить для этого jsfiddle? Невозможно активировать его
— neoswf

Можем ли мы передать здесь строку вместо элемента
— Удай А. Навапара

Это работает, только если вы внутри того же самого window. Это не настоящий буфер обмена, доступный для ОС и другой вкладки браузера. Также выбор можно легко сделать, используя select()и чем простоwindow.getSelection()
— Roko C. Buljan

0

document.execCommand('copy')буду делать то, что ты хочешь. Но в этой ветке не было примеров, которые можно было бы использовать напрямую, без мусора, так что вот он:

var textNode = document.querySelector('p').firstChild
var range = document.createRange()
var sel = window.getSelection()

range.setStart(textNode, 0)
range.setEndAfter(textNode)
sel.removeAllRanges()
sel.addRange(range)
document.execCommand('copy')

-2

Выхода нет, надо использовать вспышку. Существует плагин JQuery под названием jquery.copy, который обеспечивает кроссбраузерное копирование и вставку с использованием файла flash (swf). Это похоже на то, как работает подсветка синтаксиса в моем блоге.

После того, как вы укажете файл jquery.copy.js, все, что вам нужно сделать, чтобы поместить данные в буфер обмена, - это выполнить следующее:

$.copy("some text to copy");

Легко и приятно ;)


Ссылка не работает (файлы больше не доступны для загрузки)
— SeinopSys
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.