Я пытаюсь программно использовать execCommand в Chrome (сборка 43), чтобы скопировать результат асинхронного запроса JSONP в буфер обмена. Вот фрагмент логики:
loadContent()
function loadContent(callback) {
$.getJSON('http://www.randomtext.me/api/lorem/p-5/10-20?&callback=myFunc',function(result){
console.log('result=',result.text_out);
$("#container").html(result.text_out);
if (callback) {
callback();
}
});
}
function copyAjax() {
loadContent(copy);
}
function copy() {
var copyDivText = $('#container').text();
console.log('copyDivText=',copyDivText);
executeCopy(copyDivText);
}
document.addEventListener("DOMContentLoaded", function(){
document.getElementById("copy").onclick = copy;
});
document.addEventListener("DOMContentLoaded", function(){
document.getElementById("copyAjax").onclick = copyAjax;
});
// Copy text as text
function executeCopy(text) {
var input = document.createElement('textarea');
document.body.appendChild(input);
input.value = text;
input.focus();
input.select();
document.execCommand('Copy');
input.remove();
}
Я знаю, что, начиная со сборки 43 Chrome, вы используете execCommand с буфером обмена. Однако проблема заключается в том, что вам нужно сделать это во время выполнения пользовательского события (в котором права доступа повышены). Это аналогичное ограничение есть у решения на основе ZeroClipboard на основе флэш-памяти. За исключением получения ответа, что это невозможно (о чем я сейчас думаю), это другие варианты, которые я думал сделать в крайнем случае (предупреждение, все они Проходы Богородицы):
- Поскольку JSONP не может быть синхронным, превратите его во что-то, что использует обычный вызов AJAX, и убедитесь, что вызов AJAX синхронен в контексте выполнения пользовательского события. Это противоречит моему глубоко укоренившемуся убеждению, что мы не должны выполнять синхронные вызовы XHR, поскольку это ухудшает пользовательский опыт.
- Когда пользователь приближается с мышью к кнопке копирования, мы предварительно отправляем запрос к серверу и надеемся, что он будет достаточно быстрым, прежде чем пользователь нажмет кнопку. Это очевидное состояние гонки, которое может отсутствовать часть времени и не будет работать наверняка, когда пользователь хочет выполнить Ctrl/Command-C вместо нажатия кнопки копирования.
- Выполните двухэтапный процесс. Один щелчок, чтобы инициировать вызов, когда контент доступен, показать сообщение о доступности контента и нажать еще один щелчок в области сообщения, чтобы скопировать в буфер обмена. Это не похоже на лучшее UX-взаимодействие. Я создал этот пример с этой альтернативой. Инициация щелчка программным способом не является событием проблем пользователя. .
- Может быть способ создать простое расширение Chrome и позволить пользователю установить для этого расширения разрешение на копирование в буфер обмена. Это предполагает, что конечный пользователь должен установить и расширить и изменить настройки локального браузера. Не уверен, что многие пользователи смогут/захотят это сделать.
Я уже рассматривал вопросы Stackoverflow, такие как это, но они не относятся к асинхронному сценарию. Пожалуйста, дайте мне знать, если вы можете найти какое-либо другое работоспособное решение (или настроить существующее).