Chrome開発者コンソールから document.execCommand( 'copy'); を呼び出すと、毎回false
が返されます。
自分で試してみてください。コンソールを開いて実行すると、成功しません。
理由についての考えはありますか?
document.execCommand('copy')
はユーザーがトリガーする必要があります。コンソールからだけでなく、ユーザーによってトリガーされたイベント内ではない場所にあります。以下を参照してください。クリックイベントは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>
こちらをご覧ください: https://w3c.github.io/editing/execCommand.html#dfn-the-copy-command
Document.execCommand()からトリガーされるコピーコマンドは、ユーザーが信頼してトリガーするイベントからイベントがディスパッチされる場合、または実装がこれを許可するように構成されている場合にのみ、実際のクリップボードの内容に影響します。クリップボードへの書き込みアクセスを許可するための実装の構成方法は、この仕様の範囲外です。
別の方法として、Chrome Devツールに組み込まれている copy()
コマンドを使用します。document.execCommand("copy")
は使用できません。トリガーするにはユーザーアクションが必要だからです。
copy()
コマンドを使用すると、任意の文字列(またはオブジェクトをJSONとして)をコピーできます。 document.execCommand("copy")
をエミュレートするには、getSelection().toString()
で現在の選択を取得できます。
copy(getSelection().toString())
document.execCommand("copy")
を実際にテストする必要がある場合(たとえば、それを使用するスクリプトをデバッグするため)、デバッガーの使用が何らかの理由で理想的でない場合は、クリックハンドラーでコードをラップしてから、ページをクリックします。
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'
})
}
}