2009-11-03 2 views
5

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

Скажем, у меня есть test.html на mydomain.com

  1. Очень первая вещь в головной секции я установить document.domain = 'mydomain.com';

  2. Затем, динамически создавать IFRAME, набор SRC для "subdomain.mydomain.com/test2.html"

  3. Append 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 секунд. Это не имеет никакого смысла для меня.

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

+0

У вас есть эта проблема в IE7 и IE8 или просто в IE6? –

+0

IE 7 и IE6 оба, не тестировали на IE8 – Gotys

+0

Обновляя, вы имеете в виду попадание F5 или нажатие на область URL и попадание в нее? Они запускают два разных «стиля» перезагрузки, один из которых попадет в кеш 100%, а другой проверяет сервер на время последнего изменения. Если вы видите ошибку только при обновлении с помощью F5, попробуйте обновить, поместив курсор в окно url и нажав enter. – jvenema

ответ

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); 
+0

Большое вам спасибо! Это своего рода полезная информация. Интервал является хорошей идеей, а не таймаутом, мне пришлось обернуть условие window.parent в оператор try/catch, потому что это бросало разрешение на отклонения ошибок. Однако самая большая и странная проблема заключается в том, что для окна window.parent требуется действительно 10 секунд, чтобы стать доступным для родительского фрейма.Я даже изменил свои on_dom_ready события на on_loads, чтобы быть уверенным, nothign помог. Я хотел бы еще раз подчеркнуть - это не относится к первой загрузке страницы ... только после обновления. Есть идеи? – Gotys

0

украдкой помогли мне много! Он был на 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); 
}, 

выше функция изменяет Зав документа. Ребенок iframe генерируется в on_finish из этой функции lazy_load.

Я полагаю, что браузеры IE действительно боятся этого и занимают 12 секунд, чтобы оправиться от шока, связанного с изменением документа следующим образом :) Что я могу сделать по этой проблеме? Почему IE делает sooo для восстановления после манипуляции lazy_load dom?

+0

head.removeChild (сценарий); Внутри моего события onload возникла проблема. Проблема решена! – Gotys