Опитвам се програмно да използвам 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 като този, но те не адресират асинхронен сценарий. Моля, уведомете ме, ако можете да намерите някакво друго работещо решение (или промяна на съществуващото).