HTML5 альтернатива флеш-памяти ZeroClipboard для безопасного копирования данных в буфер обмена?
С выходом флэш-памяти во многих средах (iPhone, Android, IE10 и т. Д.), Есть ли какое-либо новое решение в любых браузерах, которое позволит безопасно копировать информацию в буфер обмена без установленной флэш-памяти?
До сих пор я использовал ZeroClipboard, но я беспокоюсь о большем количестве зрителей, у которых нет флеш-памяти, и эта функциональность будет нарушена, и я хотел бы не зависеть от Flash, когда это возможно.
6 ответов
Причина заключается в том, что автоматическое копирование в буфер обмена может быть очень опасным, поэтому большинство браузеров (кроме IE)* затрудняют это, если вы не используете flash.
Как и ваш ZeroClipboard, существует Clipboard LMCButton, который также использует небольшой flash-скрипт, работающий в фоновом режиме.
Распространенным решением будет сделать это:
function copyToClipboard (text) {
window.prompt ("Copy to clipboard: Ctrl+C, Enter", text);
}
Что я нашел у Ярека Милевского, когда кто-то еще задал вопрос здесь
* Да, я нашел одно решение для IE, однако не работает в большинстве современных браузеров, проверьте здесь.
Я знаю, что этот ответ немного запаздывает, но теперь есть новая современная альтернатива ZeroClipboard (которая основана на Flash). Clipboard.js - это альтернатива JavaScript размером 2 КБ, которая не имеет зависимостей.
Я создал чистое решение JavaScript под названием clip-j. Вот оно В основном то, что он делает, это использует в своих интересах document.execCommand('copy');
с несколькими другими командами, которые делают это так, что вы ничего не видите. Вот код:
function clip(text) {
var copyElement = document.createElement('input');
copyElement.setAttribute('type', 'text');
copyElement.setAttribute('value', text);
copyElement = document.body.appendChild(copyElement);
copyElement.select();
document.execCommand('copy');
copyElement.remove();
}
Вы можете посмотреть в этом блоге подробное обсуждение того, как работать с буфером обмена в HTML5. К сожалению, вы все еще не можете скопировать в буфер обмена по клику. Однако для chrome и firefox вы можете создать расширение для браузера, которое может дать вашему сайту разрешение на доступ к буферу обмена, и я верю, что IE разрешит вам копировать в буфер обмена, но предложит пользователю предоставить разрешение.
Обновление:
В соответствии с этим: https://developer.mozilla.org/en-US/docs/Web/API/Document/execCommand Firefox 41+, Chrome 42+ и IE 9+ поддерживают команду копирования с execCommand. Для Firefox и Chrome он будет работать только в том случае, если он вызван пользовательским действием, например щелчком, а для IE он выдаст пользователю диалоговое окно с предупреждением, запрашивающим разрешение на копирование в буфер обмена.
Чтобы использовать execCommand, вы должны сначала выбрать () что-то на странице, чтобы вы не просто копировали то, что было в последний раз помещено в буфер обмена. С помощью этой функции я передаю идентификатор входного текстового поля в функцию и выбираю () ее, затем выполняю команду копирования. Не нужно добавлять слушателей или усложнять ваш код. Document.execCommand() возвращает false, если он не включен или не поддерживается, поэтому вы можете использовать window.prompt в качестве метода резервного копирования.
function copyToClipboard(id) {
var blnCopied;
document.getElementById(id).select();
blnCopied = document.execCommand("copy", false, null);
if (blnCopied)
alert('Link copied to clipboard');
else
window.prompt ("Copy to clipboard: Ctrl+C, Enter", jQuery("#"+id).val());
}
Используйте стандартный тег привязки "a" с onclick="copyToClipboard('some_id')"
На этот вопрос есть отличные ответы, и я решил использовать этот фрагмент:
function copyToClipboard(element) {
var $temp = $("<input>");
$("body").append($temp);
$temp.val($(element).text()).select();
document.execCommand("copy");
$temp.remove();
}
Однако, если на вашей странице есть bootstrap-select, $temp.val($(element).text()).select()
строка выдаст ошибку:
Виджет может работать только на выбранных элементах
Ты можешь использовать .trigger('select')
вместо этого, как указано в документации jQuery для.select (), вот так:
$temp.val($(element).val()).trigger('select');