jquery でクリックを開始するとwindow.open()
、ポップアップ ブロッカーによってブロックされます。手動でクリックすると、ウィンドウはブロックされません。ブラウザは 2 つの間でどのように異なりますか?
3 に答える
これのFirefoxの実装については、このバグについて詳しく説明しています。この他のバグには、疑いを持たないユーザーに不要なポップアップウィンドウを表示するためにサイトが通過する長さなど、さらに興味深い背景があります(この場合window.open()
:画像load
イベント)。Bugzillaを検索すると、Mozillaの人々がこれをすべて正しく機能させるのに何年もかかったことがわかります。たとえば、2001年のバグがあります。
現在の動作は次のとおりです。Firefoxがオペレーティングシステムからクリックイベントを受信すると、JavaScriptで一定時間window.open()
有効になります(を探してくださいdom.disable_open_click_delay
)about:config
。click()
ユーザークリックが発生せずにコードからイベントを呼び出すと、最初のステップである有効化window.open()
は発生しませんが、への呼び出し自体は、ポップアップブロックが有効になっていることを検出するサイトを停止することにwindow.open()
成功します。
他のブラウザがこのようなものをどのように実装しているかはわかりませんが、それが大きく異なっていたとしたら、私は驚きます。
jQuery を介して呼び出すと、click
実際には要素のクリックが実際にトリガーされるのではなく、クリックをリッスンする関数が呼び出されると思います。したがって、呼び出していclick()
ますが、実際には関数を呼び出しているだけです。
ユーザーがクリックするとき、それは実際のクリックです。
例:
var handler = function () {
alert('hi');
};
$('#example').on('click', handler);
$('#example').click(); // really just calls handler();
ブラウザーのネイティブ コードは、(オペレーティング システムからの) 実際のマウス クリック イベントを処理し、ブラウザー イベント オブジェクトを作成します。ブラウザのネイティブ コードのその時点で、ブラウザは、このイベントが実際のマウス クリックによって作成されたことを認識します。
私の推測では、イベントに関連付けられた隠しデータ (javascript からアクセスできない) がいくつかあるため、ブラウザはイベントが実際のマウス クリックによって開始されたかどうかを追跡できますが、他の実装メカニズムも存在する可能性があります。