【问题标题】:Document.Domain madnessDocument.Domain 疯狂
【发布时间】:2010-12-12 17:53:45
【问题描述】:

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

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

  1. 我首先在 head 部分设置 document.domain = 'mydomain.com';

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

  3. 将 iframe 附加到 DOM

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

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

适用于所有浏览器。即使在 IE6 中!唯一的问题是:当我在 IE 中刷新页面时,我收到拒绝访问错误。

我可以摆脱这个错误的唯一方法是在调用 window.parent 之前等待 12 秒。连 5 秒的帮助都没有,我真的要等 12 秒。这对我来说毫无意义。

有人有这方面的经验吗?

【问题讨论】:

  • 你在IE7和IE8有这个问题,还是只有IE6?
  • IE 7 和 IE6 都没有在 IE8 上测试
  • 刷新是指按F5,还是在url区域点击回车?这些会触发 2 种不同的重新加载“样式”,一种会 100% 命中缓存,另一种会检查服务器的最后修改时间。如果您仅在使用 F5 刷新时看到错误,请尝试通过将光标放在 url 窗口中并按 Enter 进行刷新。

标签: javascript refresh cross-domain


【解决方案1】:

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 在 on_finish 从此lazy_load 函数生成。

我的猜测是,IE 浏览器对此非常害怕,需要 12 秒才能从修改文档的震惊中恢复过来 :) 对此问题我能做些什么?为什么 IE 需要很长时间才能从lazy_load dom 操作中恢复?

【讨论】:

  • head.removeChild( 脚本 );在我的 onload 事件中导致了问题。问题解决了!
【解决方案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);

【讨论】:

  • 非常感谢!这是一种有用的信息。间隔是一个好主意而不是超时,我不得不将 window.parent 条件包装到 try/catch 语句中,因为它向我抛出了权限被拒绝的错误。然而,最大和最奇怪的问题是,window.parent 需要 10 秒才能对父框架可用。我什至将我的 on_dom_ready 事件更改为 on_loads 以确保没有任何帮助。我想再次强调 - 这不是第一次加载页面的情况..只有在刷新之后。有什么想法吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-17
  • 2021-01-21
  • 2011-01-06
  • 2011-01-27
  • 2018-05-04
  • 2011-12-22
相关资源
最近更新 更多