これがお役に立てば幸いです。同じドメインの iframe コンテンツでのみ機能します。新しい属性サンドボックスは可能性を広げますが、今のところ Chrome でのみ実装されています。
1) IF がロードされたことを検出する
myIF.addEventListener("load",ifOnLoad,true);
2) IF ウィンドウへの参照を取得し、iframe が読み込まれるたびに onBeforeUnload イベントのリスナーを登録します。
ifContentWindow = myIF.contentWindow;
ifContentWindow.addEventListener("beforeunload", ifOnUnload,false);
3)handler(ifOnUnload) が呼び出されると、ifContentWindow.location を取得するために早く、それを読み取るために遅延を設定します。
setTimeout(delayedIFUnload, 100);
4)delayedIFUnload 関数で if の場所を取得し、メイン ページをリダイレクトします。
window.location = ifContentWindow.location;
私は自分の環境(MAC、Chrome)でコードをテストするだけで、他のブラウザ用にコードを調整するためにいくつかの作業を行う必要があります。たとえば、addEventListener または contentWindow を使用します。
ここに作業コードのリンクがありますhttp://pannonicaquartet.com/test/testif.html、私はフィドルでそれをやろうとしましたが、フィドルには多くのフレームがあり、その中でコードが正しく機能しません。このタイプの操作では、少なくとも Chrome ではアラートがブロックされるため、メッセージにスパンを使用します。
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Untitled Document</title>
<script language="javascript" type="text/javascript">
var myIF, spNotify, ifContentWindow;
function init(){
myIF = document.getElementById("myIF");
spNotify = document.getElementById("spNotify");
myIF.src="testIF_1.html";
myIF.addEventListener("load",ifOnLoad,true);
}
function ifOnLoad(){
try{
ifContentWindow = myIF.contentWindow;
ifContentWindow.addEventListener("beforeunload", ifOnUnload,false);
}catch(er){
alert(er);
}
}
function ifOnUnload(){
try{
notify(ifContentWindow.location);
setTimeout(delayedIFUnload, 100);
}catch(er){
alert(er);
}
}
function delayedIFUnload(){
try{
notify(ifContentWindow.location);
}catch(er){
alert(er);
}
}
function notify(what){
spNotify.innerText = what;
}
</script>
</head>
<body onload="init();">
<div id="dvMsg">Target: <span id = "spNotify"></span></div>
<iframe id="myIF" src=" " style="width:1100px;height:700px;" />
</body>
明けましておめでとう!!!
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Untitled Document</title>
<script language="javascript" type="text/javascript">
var myIF, spNotify, ifContentWindow, lastURL, timerRef;
function init(){
myIF = document.getElementById("myIF");
spNotify = document.getElementById("spNotify");
myIF.src="testIF_1.html";
myIF.addEventListener("load",ifOnLoad,true);
}
function ifOnLoad(){
try{
ifContentWindow = myIF.contentWindow;
ifContentWindow.addEventListener("beforeunload", ifOnUnload,false);
}catch(er){
alert(er);
}
}
function ifOnUnload(){
try{
notify(ifContentWindow.location);
lastURL = ifContentWindow.location;
timerRef = setInterval(delayedIFUnload, 5);
}catch(er){
alert(er);
}
}
function delayedIFUnload(){
try{
if(lastURL != ifContentWindow.location){
notify(ifContentWindow.location);
clearInterval(timerRef);
}
}catch(er){
alert(er);
}
}
function notify(what){
spNotify.innerText = what;
}
</script>
</head>