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

90

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

Черное солнце
источник
Не нашел, искал то же самое. Хотел использовать Flash, поэтому удалил эту функцию перед созданием.
eugeneK
2
дубликат stackoverflow.com/questions/400212/…
wizztjh
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')
odinho - Velmont
источник
-2

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

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

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

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

Талха Ахмед Хан
источник
Ссылка не работает (файлы больше не доступны для загрузки)
SeinopSys