【问题标题】:Reading window.location after setting document.domain in IE(6)在 IE 中设置 document.domain 后读取 window.location(6)
【发布时间】:2010-12-02 16:43:47
【问题描述】:

我有一个页面,www.example.com/index.html 上的脚本打开 home.example.com/foo.html一个弹出窗口。当用户关闭弹出窗口时,我想通过在其上调用 Javascript 函数来通知打开器页面(它对 DOM 做了一些事情)。我像这样使用unbeforeunload

    // In index.html on www.example.com:
    window.fn = function () { /* Perform stuff after foo.html has closed */ }

    // In foo.html on home.example.com:
    window.onbeforeunload = function () {
        if (window.opener && window.opener.fn)
            window.opener.fn();
    };

这不起作用,因为网页位于不同的域中。我可以设置document.domain 属性来克服这个问题:

document.domain = "example.com";

不幸的是,这与我在 foo.html 端(Apache Wicket)使用的网络应用程序框架不能很好地配合,因为它包含一个执行以下操作的脚本:

var src = (window.location.protocol == 'https:') ? something : other;

显然,在 IE6* 中,当您设置文档域时,location 对象变为只写,因此尝试读取 window.location.protocol 会引发“访问被拒绝”。

所以,我的问题是:如何在允许跨域 Javascript 函数调用的同时仍然允许我的脚本读取 location 对象的内容?

  • 我无法通过服务器。 (我要调用的函数所执行的工作实际上并不是这样。)
  • 在设置document.domain 之前我无法读取window.location.protocol 属性,然后在条件赋值中使用该值;这样做需要我重新构建 Web 框架库 - 这不是我想做的事情。

* 也可能在其他版本的 IE 中;没查过。

【问题讨论】:

    标签: javascript internet-explorer-6 cross-domain


    【解决方案1】:

    我看不懂 window.location.protocol 属性 在设置 document.domain 和之前 然后在条件中使用该值 任务;这样做需要我 重建 Web 框架库 - 不是我想做的事。

    你不能在设置 document.domain 之前读取 window.location.protocol 并在它变为只写时设置 window.location.protocol 吗?这是否也需要重建框架?这是一个 hack,但 IE 也是。

    【讨论】:

    • 不幸的是,它不起作用。即使在我写它之后它仍然是只写的。
    【解决方案2】:

    你会使用 jQuery 吗?有一个不错的插件可以让你通过 IE 6-8 中的 iframe 执行 window.postMessage:http://benalman.com/code/test/js-jquery-postmessage/

    您可以从 iframe 打开弹出窗口,并使用 postMessage 在 iframe 和父级之间传递您的对象。

    【讨论】:

    • 这可能是我最好的镜头。谢谢。
    猜你喜欢
    • 1970-01-01
    • 2013-01-20
    • 2011-10-13
    • 2011-04-08
    • 1970-01-01
    • 2015-02-12
    • 2012-02-07
    • 1970-01-01
    • 2010-11-13
    相关资源
    最近更新 更多