iframeを囲むdivでクリックイベントまたはマウスダウンイベントをキャプチャするにはどうすればよいですか。divのクリックイベントに関数をアタッチしようとしましたが、iframeがイベントを周囲のdivにバブルすることはないため、関数が呼び出されることはありません。divでイベントをキャプチャし、それをデフォルトのアクションのためにiframeに伝播する方法はありますか?
3 に答える
クリックがiframe領域にある場合、iframeコンテキストはクリックイベントを処理し、iframeの親にバブルアップしません。そのため、iframe領域でクリックイベントが発生した場合、divはクリックイベントをまったく登録しません。
さらに、iframeにiframeの親と同じドメインに属していないページが含まれている場合、相互作用は禁止されます(同一生成元ポリシー)。
同一生成元ポリシーが満たされている場合、実行できることがいくつかあります。iframeの親コンテキストでメソッドを呼び出すことができます。
top.parentFunction();
そのため、iframeに、iframeの親(top
参照でアクセス可能)に委任するイベントリスナーを追加します。
イベントの伝播ははるかに複雑なので、DiegoPeriniのNWEventsライブラリを参照します。彼のイベントシステムは、世の中で最も優れたものの1つであり、iframeの相互作用に特にこだわっていると思います。
私は確かにこれを達成するために独自のコードを書き始めることはありません。適切に実行したい場合、これは簡単に1年のプロジェクトになる可能性があり、それでもディエゴの作業より劣ります。
これを行う「良い」方法はありませんが、Iframeのクリックを本当に検出する必要がある場合は、最新のブラウザーでそれを行うことができます。
<iframe src="http://mtw-ed.com/" id="iframe" style=""></iframe>
<script type="text/javascript">
var inIframe = false;
function checkClick() {
if (document.activeElement
&& document.activeElement === document.getElementById("iframe")) {
if (inIframe == false) {
alert("iframe click");
inIframe = true;
}
} else
inIframe = false;
}
setInterval(checkClick, 200);
</script>
このスクリプトは、ユーザーがIframeにいるかどうかを200ミリ秒ごとにチェックします。もちろん、彼らはそこにたどり着くためにIframeをクリックしていないかもしれませんが、これが@BGerrissenのソリューションなしでできる最善の方法だと思います。
もう一度クリックしない限り、最初の「クリック」のみが検出されます。それは本当に現代のブラウザでのみ動作します。