2

我有一个 iframe,我无法控制它的内容。在 iframe 内部会有重定向,而不是在顶部窗口中重定向(我期望的),重定向总是发生在 iFrame 中。我在这里尝试了解决方案:如果无法控制重定向,如何在 onload 发生之前获取重定向 url?但结果并不理想。

现在在 iframe 页面中,我想使用$(window).unload()并手动更改top.window.location.href以在顶部窗口中强制重定向。那么有谁知道如何在点击之后和onload重定向页面之前检测要重定向到的地址?谢谢!

PS:重定向的页面是同域的。

4

1 回答 1

1

我希望这可以帮助你,它只适用于同一域 iframe 内容,新属性沙箱将扩展可能性,但目前仅由 Chrome 实现。

1)检测IF何时加载

myIF.addEventListener("load",ifOnLoad,true);

2)每次加载 iframe 时,获取 IF Window 的引用并为 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 回答