document.execCommand ('cut' / 'copy') было отклонено в закладке - PullRequest
0 голосов
/ 09 февраля 2019

Я работаю над закладкой, которая создает ссылку href на текущей вкладке браузера и копирует ее в буфер обмена.Этот букмарклет работает в Safari:

javascript:
!function(a){
var%20b=document.createElement("textarea"),
c=document.getSelection();
b.textContent=a,document.body.appendChild(b),
c.removeAllRanges(),b.select(),
document.execCommand("copy"),
c.removeAllRanges(),
document.body.removeChild(b)}
('<a%20title="'+document.title+'"%20href="'+document.location.href+'">'+document.title+'</a>');

Но в Firefox 65 я получаю сообщение об ошибке «document.execCommand ('cut' / 'copy') отклонено, потому что он не был вызван из-за недолговечного пользователясгенерированный обработчик событий. "При просмотре Копирование в буфер обмена с помощью document.execCommand ('copy') завершается неудачно с большими текстами Я пытаюсь сгенерировать html-ссылку перед функцией, чтобы решить проблему, указанную в ответе.Но с кодом ниже я получаю новую вкладку браузера с текстом "true" и без скопированной ссылки на буфер обмена.

javascript:
const text = ('<a%20title="'+document.title+'"%20href="'+document.location.href+'">'+document.title+'</a>');
!function(a){
var%20b=document.createElement("textarea"),
c=document.getSelection();
b.textContent=a,document.body.appendChild(b),
c.removeAllRanges(),
b.select(),
document.execCommand("copy"),
c.removeAllRanges(),
document.body.removeChild(b)}('text');

Это проблема синхронизации с генерацией ссылки href?Или что-то еще?

1 Ответ

0 голосов
/ 12 февраля 2019

Ваша проблема не такая, как в в другом вопросе : в вашем случае у вас нет события, инициируемого пользователем.

Так что нет, это не такпроблема времени, просто вам нужно такое событие.

Чтобы заставить его, вы можете показать заставку, требующую, чтобы пользователь букмарклета нажимал на страницу.Из этого события щелчка вы бы назвали execCommand('copy').

javascript:(function(a){
  var splash = document.createElement('div'),
    msg = document.createElement('span');
  splash.style='position:fixed;top:0;left:0;width:100vw;height:100vh;display:flex;justify-content:center;align-items:center;background:#FFF;z-index:999999';
  msg.textContent = 'click me';
  splash.append(msg);
  // wait for the click event
  splash.onclick = evt => {
    var b=document.createElement("textarea"),
    c=document.getSelection();
    b.textContent=a,
    document.body.appendChild(b),
    c.removeAllRanges(),
    b.select(),
    document.execCommand("copy"),
    c.removeAllRanges(),
    document.body.removeChild(b),
    document.body.removeChild(splash);
  };
  document.body.append(splash);
})

Вот живой пример того, что происходит (очевидно, не в виде букмарклета):

(function(a){
  var splash = document.createElement('div'),
    msg = document.createElement('span');
  splash.style='position:fixed;top:0;left:0;width:100vw;height:100vh;display:flex;justify-content:center;align-items:center;background:#FFF;z-index:999999';
  msg.textContent = 'click me';
  splash.append(msg);
  // wait for the click event
  splash.onclick = evt => {
    var b=document.createElement("textarea"),
    c=document.getSelection();
    b.textContent=a,
    document.body.appendChild(b),
    c.removeAllRanges(),
    b.select(),
    document.execCommand("copy"),
    c.removeAllRanges(),
    document.body.removeChild(b),
    document.body.removeChild(splash);
  };
  document.body.append(splash);
})
('<a%20title="'+document.title+'"%20href="'+document.location.href+'">'+document.title+'</a>');
<textarea>You can paste here to check what's been copied</textarea>
...