シングルページアプリを開発しています。ページにボタンがあり、ユーザーがサーバーにajax呼び出しを行うボタンをクリックすると、戻り値(コールバック経由)がユーザーのクリップボードにコピーされます。
各コンポーネントは独立して動作しますが、それらを一緒に接着すると、Firefoxは次のエラーを返します。
document.execCommand( ‘cut’/‘copy’)は、実行中の短いユーザー生成イベントハンドラー内から呼び出されなかったため、拒否されました
このエラーの詳細を知りたいのですが、オンラインでの情報はまったくありません。このエラーをトリガーする制限条件は何ですか、それはスタックの深さ、タイムアウトなどですか?
firefoxではclick
ハンドラでのみ機能します。参照 Interact_with_the_clipboard
_user event
_処理の完了後に実行するために、execCommand('cut'/'copy')
呼び出しをasync requestでラップします。
_$.Deferred
_の例:
_function asyncCall() {
return $.Deferred().resolve().promise();
}
asyncCall().then(function() {
var supported = document.queryCommandSupported('copy');
if (supported) {
// ... select action
document.execCommand('copy');
}
});
_
私はこの問題に対処しなければなりませんでした。
私にとって、呼び出しは十分に高速なので、解決策は単にasyncをfalseに設定することでした。
クリップボードについて リンクを表示 できます。他の方法では、同期を使用します。例:
$.ajax({
method: "GET",
async: false,
url: {your_url},
success: function(res) {
let link= res.link;
let temp_raw = $("<input>");
$("body").append(temp_raw);
temp_raw.val(link);
temp_raw.select();
document.execCommand("copy");
temp_raw.remove();
}
});