Невозможно использовать `document.execCommand('copy');` из консоли разработчика

Вызов document.execCommand('copy'); из консоли разработчика Chrome возвращает false каждый раз.

Попробуйте сами. Откройте консоль и запустите ее, она никогда не удастся.

Любая идея о том, почему?

введите описание изображения здесь

Ответы

Ответ 1

document.execCommand('copy') должен запускаться пользователем. Это не только с консоли, но и в любом месте, которое не внутри события, вызванного пользователем. См. Ниже, событие click вернет true, но вызов без события не будет и вызов в отправленном событии также.

console.log('no event', document.execCommand('bold'));

document.getElementById('test').addEventListener('click', function(){
    console.log('user click', document.execCommand('copy'));
});

document.getElementById('test').addEventListener('fakeclick', function(){
    console.log('fake click', document.execCommand('copy'));
});


var event = new Event('fakeclick')

document.getElementById('test').dispatchEvent(event) ;
<div id="test">click</ha>

Ответ 2

В качестве альтернативы используйте команду copy(), которая встроена в инструменты Chrome Dev. Вы не можете использовать document.execCommand("copy"), потому что для его запуска требуется действие пользователя.

Команда copy() позволяет скопировать любую строку (или объект как JSON). Чтобы эмулировать document.execCommand("copy"), вы можете получить текущий выбор с помощью getSelection().toString():

copy(getSelection().toString())

screen shot

Если вам действительно нужно протестировать document.execCommand("copy") специально (например, для отладки script, который его использует), а использование отладчика по какой-то причине не идеально, вы можете обернуть свой код в обработчик кликов, а затем нажмите на свою страницу:

document.body.addEventListener("click", function() {
    console.log("copy", document.execCommand("copy"));
}, false);

Ответ 3

Я считаю, что команда copy требует сосредоточиться на браузере, а когда вы переходите в консоль и выполняете эту команду, текущее окно теряет фокус. Но могут быть и другие причины, поскольку это сработало, если я даю в setTimeout().

Ответ 4

Этот метод работает в последней версии сафари

const copyUrl = (url, cb) => {
  try {
    var input = document.getElementById('copyInput')
    input.value = url
    input.focus()
    input.select()
    if (document.execCommand('copy', false, null)) {
      Message('复制成功')
    } else {
      Message({
        message: '当前浏览器不支持复制操作,请使用Ctrl+c手动复制',
        type: 'warning'
      })
    }
  } catch (e) {
    Message({
      message: `复制出错:${e}`,
      type: 'error'
    })
  }
}