Копировать в буфер обмена без 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.