Безумие Document.Domain

Я провел, наверное, месяц, исследуя Интернет по этому вопросу, и до сих пор не нашел ответа на этот вопрос. Мой код делает следующее (все Javascript).

Допустим, у меня есть test.html на mydomain.com.

  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

Работает во всех браузерах. даже в IE6! Единственная проблема: когда я обновляю страницу в IE, я получаю ошибку отказа в доступе.

Единственный способ избавиться от этой ошибки — подождать 12 секунд перед вызовом window.parent. Не помогают даже 5 секунд, мне буквально приходится ждать 12 секунд. Это не имеет никакого смысла для меня.

У кого-нибудь есть опыт в этом?


person Gotys    schedule 03.11.2009    source источник
comment
У вас есть эта проблема в IE7 и IE8 или только в IE6?   -  person C. Ross    schedule 03.11.2009
comment
IE 7 и IE6 оба, не проверял на IE8   -  person Gotys    schedule 03.11.2009
comment
Под обновлением вы имеете в виду нажатие F5 или щелчок в области URL-адреса и нажатие Enter? Они запускают 2 разных стиля перезагрузки, один из которых 100% попадет в кеш, а другой проверит сервер на время последнего изменения. Если вы видите ошибку только при обновлении с помощью F5, попробуйте обновить, поместив курсор в окно URL-адреса и нажав Enter.   -  person jvenema    schedule 04.11.2009


Ответы (2)


Это связано с тем, что событие onload в родительском фрейме еще не запущено, и поэтому DOM не полностью построен. Вот кладж, который будет сканировать 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);
person furtive    schedule 03.11.2009
comment
Большое спасибо! Это своего рода полезная информация. Интервал - хорошая идея вместо тайм-аута, мне пришлось обернуть условие window.parent в оператор try/catch, потому что он выдавал мне ошибки отказа в разрешении. Однако самая большая и странная проблема заключается в том, что для того, чтобы window.parent стал доступным для родительского фрейма, требуется действительно 10 секунд. Я даже изменил свои события on_dom_ready на on_loads, просто чтобы быть уверенным, ничего не помогло. Еще раз подчеркну - дело не в ПЕРВОЙ загрузке страницы.. только после рефреша. Есть идеи? - person Gotys; 03.11.2009

Ответ Furtive мне очень помог! Он был на 100% прав в том, что проблема действительно в событии onload. Я углубился в свой код и обнаружил, что перед созданием дочернего 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?

person Gotys    schedule 03.11.2009
comment
head.removeChild (скрипт); внутри моего события загрузки вызывало проблему. Задача решена! - person Gotys; 04.11.2009