在IE中设置document.domain后读取window.location(6)

gus*_*afc 5 javascript cross-domain internet-explorer-6

我有一个页面,其中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();
    };
Run Code Online (Sandbox Code Playgroud)

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

document.domain = "example.com";
Run Code Online (Sandbox Code Playgroud)

不幸的是,这与我在foo.html端(Apache Wicket)上使用的Web应用程序框架不兼容,因为它包含一个执行如下操作的脚本:

var src = (window.location.protocol == 'https:') ? something : other;
Run Code Online (Sandbox Code Playgroud)

显然,在IE6 *中,当您设置文档域时,该location对象变为只写,因此尝试读取window.location.protocol会抛出"拒绝访问".

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

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

*也可能在其他版本的IE中; 没有检查.

Wil*_*avy 1

你能使用 jQuery 吗?有一个不错的插件,允许您在 IE 6-8 中通过 iframe 执行 window.postMessage:http://benalman.com/code/test/js-jquery-postmessage/

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