2

コンテンツを制御できない iframe があります。トップウィンドウでリダイレクトされるのではなく(私が期待する)、リダイレクトは常にiFrameで発生します。ここで解決策を試しました:リダイレクトを制御できない場合、オンロードが発生する前にリダイレクト URL を取得する方法は? しかし、結果は理想的ではありません。

iframeページ内で、使用$(window).unload()して手動で変更top.window.location.hrefし、トップウィンドウでリダイレクトを強制します。クリック後、リダイレクトされたページの前に、リダイレクト先のアドレスを検出する方法を知っている人はいonloadますか? ありがとう!

PS: リダイレクトされたページは同じドメインのものです。

4

1 に答える 1

1

これがお役に立てば幸いです。同じドメインの 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>
于 2013-01-01T16:16:29.050 に答える