私はフレームバスティングバスター(名前の由来はhehe)に取り組んでいます。これにより、ユーザーは自分のページにとどまり、ターゲットURLで新しいウィンドウが開きます。ライトボックススクリプトを使用してiframeを表示しています。これは、私が行っていることです。
1)すべての.lightboxクリックのイベントを追加しました。fe:
$('.lightbox').live("click", function(e) {
e.preventDefault();
$('#redirectURL').val($(this).attr('href'));
$(this).lightbox();
}
2)フレームバスティングバスターを追加しました:
<script type="text/javascript">
var prevent_bust = 0
window.onbeforeunload = function() { prevent_bust++ }
setInterval(function() {
if (prevent_bust > 0) {
prevent_bust -= 2
window.top.location = 'http://server-which-responds-with-204.com'
}
}, 1)
</script>
3)私のニーズに合うようにフレームバスティングバスターコードを変更しました:
- iframeがwindow.top.locationを変更したいかどうかを検出します
- その場合は、204サーバーの応答を使用してこれが発生しないようにします
- 新しいページを開く:
window.open( $('#redirectURL', '_blank' );
- ライトボックスを閉じる:
$('.jquery-lightbox-button-close').click();
これまでのところ、これは私が思いついたものです:
var prevent_bust = 0
window.onbeforeunload = function() { prevent_bust++ }
setInterval(function() {
if (prevent_bust > 0) {
prevent_bust -= 2;
redirectURL = $('#redirectURL').val();
if(redirectURL != "") {
window.top.location = 'http://www.****.com/ajax/nocontent.php';
window.open(redirectURL, "_blank");
$('.jquery-lightbox-button-close').click();
$('#redirectURL').val('');
} else {
window.top.location = 'http://www.****.com/ajax/nocontent.php';
}
}
}, 1);
// 編集:Before I forget, 'nocontent.php' is a file that returns a 204 header
Firefoxの場合、プログラムしたとおりに動作します。window.top.locationで変更が検出されると、新しいフレーム/ページが開き、iframeが一番上の場所を再読み込みして切り上げるのを防ぎ、jQueryライトボックスを閉じます。
Safari / Chromeも同様に動作し、新しいブラウザ画面を開きます(not sure if theres an option to say target="_newtab" or something?
)。唯一の悪い点は、ポップアップがブロックされているというメッセージが実際に表示されないことですが、ページへのリンクを含むポップアップバルーンをWebサイトに表示することで回避できます。
Internet Explorerは、なんと衝撃的なのか、残った唯一の黒い羊です。IEは新しいポップアップを開かず、iFrameによってリセットされたwindow.top.locationをブロックせず、ページ全体を「#targetURL」に更新し続けます。これはデフォルトのバスティングコードでも同じです。したがって、私の編集の一部が原因ではありません。
私のコードの間違いを見つけることができる人はいますか?
また、リクエストがiframeによって行われたのか、ユーザー自身によって行われたのかを確認するための少しの変更が必要になります。これは、ユーザーがツールバーのアドレスを変更したり、をクリックしてページを離れたりするオプションが実際にはないためです。リンク、これは本当に必要ではありませんLOL。
前もって感謝します。