web-dev-qa-db-ja.com

Firefox-document.execCommand( ‘cut’ / ‘copy’)は、実行中の短いユーザー生成イベントハンドラー内から呼び出されなかったため、拒否されました

シングルページアプリを開発しています。ページにボタンがあり、ユーザーがサーバーにajax呼び出しを行うボタンをクリックすると、戻り値(コールバック経由)がユーザーのクリップボードにコピーされます。

各コンポーネントは独立して動作しますが、それらを一緒に接着すると、Firefoxは次のエラーを返します。

document.execCommand( ‘cut’/‘copy’)は、実行中の短いユーザー生成イベントハンドラー内から呼び出されなかったため、拒否されました

このエラーの詳細を知りたいのですが、オンラインでの情報はまったくありません。このエラーをトリガーする制限条件は何ですか、それはスタックの深さ、タイムアウトなどですか?

17
mils

firefoxではclickハンドラでのみ機能します。参照 Interact_with_the_clipboard

14
uingtea

_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');
    }
});
_
0

私はこの問題に対処しなければなりませんでした。

私にとって、呼び出しは十分に高速なので、解決策は単にasyncをfalseに設定することでした。

0
beginner_

クリップボードについて リンクを表示 できます。他の方法では、同期を使用します。例:

 $.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();
   }
});

0
MinIsNghia