Document.Domain疯狂

时间:2009-11-03 17:48:41

标签: javascript refresh cross-domain

我花了一个月的时间在这个问题上研究互联网,但还没有找到答案。我的代码执行以下操作(所有Javascript)。

假设我在mydomain.com上有一个test.html

  1. 头部的第一件事我设置了document.domain ='mydomain.com';

  2. 然后,动态创建iframe,将src设置为“subdomain.mydomain.com/test2.html”

  3. 将iframe附加到DOM

  4. subdomain.mydomain.com/test2.html:头部第一件事:document.domain ='mydomain.com';

  5. test2.html有on_dom_ready事件尝试通过window.parent与父进行通信

  6. 适用于所有浏览器。甚至在IE6中!唯一的问题是:当我在IE中刷新页面时,我得到访问被拒绝错误。

    我能摆脱这个错误的唯一方法是在调用window.parent之前等待12秒。甚至没有5秒的帮助,我真的要等12秒。这对我没用。

    任何人都有这方面的经验吗?

2 个答案:

答案 0 :(得分:2)

这是因为父帧中的onload事件尚未触发,因此DOM未完全构建。这是一个kludge,它将以一定间隔扫描div,直到它存在,而不会爆炸:

var minmax_SCANDELAY= 500;
var minmax_scanner;

function minmax_scan() {
    if (!window.parent.document.getElementById('content')) return;
    window.clearInterval(minmax_scanner);

    //replace following function call with your own.
    doYourMagicHere();
}

minmax_scan();
minmax_scanner= window.setInterval(minmax_scan, minmax_SCANDELAY);

答案 1 :(得分:0)

Furtive的答案对我帮助很大!由于onload事件确实是问题,他100%正确。我已经深入研究了我的代码,我发现,在创建子iframe之前,我懒得用以下技术加载一些脚本:

lazy_load: function(url,on_finish_function)
{
    var head = document.getElementsByTagName("head")[0];
    var script = document.createElement("script");
    script.src = url;
    var done = false;

    var This = this;
    // Attach handlers for all browsers
    script.onload = script.onreadystatechange = function()
    {
        if ( !done && (!this.readyState || this.readyState == "loaded" || this.readyState == "complete"))
        {
            done = true;
            on_finish_function.call(This,null);
            head.removeChild( script );
        }
    };
    head.appendChild(script);
},

上述功能修改了文档的HEAD部分。 子iframe在这个lazy_load函数中以on_finish生成。

我的猜测是,IE浏览器真的害怕这个并花了12秒时间从文件修改这样的冲击中恢复过来:)我该怎么办?为什么IE需要很长时间才能从lazy_load dom操作中恢复?