Невозможно использовать `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'
})
}
}