0

Chrome で Webkit 通知を処理しています。このメソッドwindow.webkitNotifications.requestPermissionは、ユーザー アクション (クリックなど) からのみ呼び出すことができます。それ以外の場所で呼び出しても効果はなく、エラーも発生しません。

何らかの理由で、実際のクリックによって最初に生成された別のイベントで後で実行する必要があります。

次のようなクリックを生成して、このメソッドを実行しようとしました。

var a = document.createElement('a');
a.addEventListener('click', function () {
  window.webkitNotifications.requestPermission()
});
var evt = document.createEvent("MouseEvents");
evt.initMouseEvent("click", true, true, window, 1, 0, 0, 0, 0,
false, false, false, false, 0, null);
a.dispatchEvent(evt);

しかし、予想通り、この方法は効果がありません。Chrome が実際にユーザーの操作をどのように検出するのか疑問に思うのはなぜですか? 生成されたイベントと実際のユーザー アクションによって生成されたイベントの違いは何ですか?

また、元のクリック イベントへの参照を保持し、このメソッドを呼び出す必要があるときにそれを戻そうとしましたが、機能しません。

私の問題を説明するためにフィドルを作成しました: http://jsfiddle.net/arnaudbreton/B38yJ/1/

4

1 に答える 1

1

ユーザーによって生成されたすべてのクリック アクションには、イベントがユーザーによって作成されたかどうかを示す秘密のプロパティがあります。開発者には見えませんが、基盤となる JavaScript エンジン用に存在します。

誤って悪意のある Web サイトにアクセスした場合など、悪意のあるコードがユーザーのブラウザーで実行されるのを防ぐために必要です。

一般的な例の 1 つは、 でクリック イベントをトリガーするだけではファイル ブラウザ ダイアログを開くことができないことですinput[type=file]。ユーザーは、ファイル ブラウザーを開くための真のクリック イベントを作成しました。

もう 1 つのことは、上記の例のようにセキュリティが重要な関数をトリガーするには、すべてのイベント リスナーが同期している必要があることです。

結論として、偽のイベントは、セキュリティを重視するブラウザー API を呼び出すことはできません。

于 2013-09-05T15:04:37.957 に答える