Вызов document.execCommand('copy'); из консоли разработчика Chrome возвращает false каждый раз.
Попробуйте сами. Откройте консоль и запустите ее, она никогда не удастся.
Любая идея о том, почему?
Вызов document.execCommand('copy'); из консоли разработчика Chrome возвращает false каждый раз.
Попробуйте сами. Откройте консоль и запустите ее, она никогда не удастся.
Любая идея о том, почему?
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> В качестве альтернативы используйте команду copy(), которая встроена в инструменты Chrome Dev. Вы не можете использовать document.execCommand("copy"), потому что для его запуска требуется действие пользователя.
Команда copy() позволяет скопировать любую строку (или объект как JSON). Чтобы эмулировать document.execCommand("copy"), вы можете получить текущий выбор с помощью getSelection().toString():
copy(getSelection().toString())

Если вам действительно нужно протестировать document.execCommand("copy") специально (например, для отладки script, который его использует), а использование отладчика по какой-то причине не идеально, вы можете обернуть свой код в обработчик кликов, а затем нажмите на свою страницу:
document.body.addEventListener("click", function() {
console.log("copy", document.execCommand("copy"));
}, false);
Я считаю, что команда copy требует сосредоточиться на браузере, а когда вы переходите в консоль и выполняете эту команду, текущее окно теряет фокус. Но могут быть и другие причины, поскольку это сработало, если я даю в setTimeout().
Этот метод работает в последней версии сафари
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'
})
}
}