【问题标题】:How to access location.href of a nested frame in IE8 on same domain?如何在同一域的 IE8 中访问嵌套框架的 location.href?
【发布时间】:2018-06-20 19:25:29
【问题描述】:

我的主页包含一个<iframe>,它指向一个包含<frameset> 的HTML 文件。它看起来类似于以下内容(为便于阅读而进行了简化):

<html>
<body>
  <iframe id="content" src="/same/domain/url" />
</body>
</html>

&lt;iframe&gt; 的内容如下所示:

<html>
<body>
  <frameset>
    <frame name="menu" src="/same/domain/menu/url" />
    <frame name="main" src="/same/domain/initial/main/url" />
  </frameset>
</body>
</html>

我正在尝试从主页读取main 框架的当前位置href。

$("#content").contents().find("frame[name=main]")[0].contentWindow.location.href

不幸的是,在 IE8 上它给了我“权限被拒绝”错误。这看起来像是跨域脚本预防机制,但所有 URL 都来自同一个域/协议/端口。对于相同的 javascript 代码,Chrome 给了我正确的值(惊喜,惊喜)。

请注意:

  • 我不能使用框架的src 属性,因为用户可能已经使用“菜单”框架导航到另一个页面(仍然是同一个域)。
  • 我无法控制 iframe 页面的内容,这些内容由应用程序的另一部分提供,在我看来无法修改

我该如何解决这个问题?

【问题讨论】:

    标签: javascript internet-explorer iframe internet-explorer-8 frameset


    【解决方案1】:

    一种方法是使用postMessageapi,它允许在不同的窗口/框架之间传递消息。

    在根窗口,监听消息

    window.attachEvent("onmessage", (e) => {
    
        // handle message
    
    });
    

    向子框架发布消息(iframe 是一个 dom 节点)。

    iframe.contentWindow.postMessage({}, "*");
    

    在孩子体内

    window.parent.postMessage({}, "*");
    

    这允许一个简单的事件驱动的通信方案,您可以在其中以消息的形式发送操作并稍后接收响应 作为onmessage 事件。

    在你的情况下,你会有一些东西:

    // within child iframe
    window.attachEvent("message", function (e) {
        // IE8 does not support object passing, only strings
        var message = JSON.parse(e.data);
    
        // wait for a GET_HREF message
        // and respond to it with the
        // data.
        if (message.type === "GET_HREF") {
            window.parent.postMessage(JSON.stringify({
                type: "GET_HREF",
                data: $("frame")
                    .map(function () {
                        return this.href;
                    })
                    .get()
            }));
        }
    });
    
    
    // within parent window
    window.attachEvent("message", function (e) {
        // IE8 does not support object passing, only strings
        var message = JSON.parse(e.data);
    
        // wait for a GET_HREF message
        if (message.type === "GET_HREF") {
            updateHref(message.data);
        }
    });
    
    iframe.contentWindow.postMessage(JSON.stringify({
        type: "GET_HREF"
    }), "*");
    

    【讨论】:

    • 感谢您的解决方案。不幸的是,我无法修改iframe 的内容,因此frame 向父母发送消息不是一种选择。我已经相应地更新了问题。
    • 好的,那么它可能有点难以实现。一个 hacky 方法可能是获取页面,将它们解析为文档并查找框架的值?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-19
    • 1970-01-01
    • 2015-04-05
    • 1970-01-01
    • 2022-10-14
    相关资源
    最近更新 更多