Как получить ссылку на объект окна iframe внутри обработчика загрузки iframe, созданного из родительского окна

Прежде чем я вставлю любой код, здесьСценарий:У меня есть HTML-документ, который создает пустой iframe с использованием JavaScriptJavaScript создает функцию и прикрепляет ссылку на эту функцию в iframe 's объект документа (используяdoc.open() получить ссылку на документ)Затем функция прикрепляется какonload обработчик для iframe 'с документом (письменно в iframe.

Что меня озадачило, так это то, что объекты global (window) и document внутри обработчика onload (пока он 's running) отличается от тех же объектов, которые выполняются через JavaScript, добавленный через узлы сценария.

Вот'с HTML:




(function(){
  var dom,doc,where,iframe;

  iframe = document.createElement('iframe');
  iframe.src="javascript:false";

  where = document.getElementsByTagName('script')[0];
  where.parentNode.insertBefore(iframe, where);

  doc = iframe.contentWindow.document;

  var _doc = document;

  doc.open()._l=function() {
    // the window object should be the one that doc is inside
    window.vanishing_global=new Date().getTime();

    var js = this.createElement("script");
    js.src = 'test-vanishing-global.js?' + window.vanishing_global;

    window.name="foobar";
    this.foobar="foobar:" + Math.random();
    document.foobar="barfoo:" + Math.random();

    // `this` should be the document object, but it's not
    console.log("this == document: %s", this == document);
    console.log("this == doc:      %s", this == doc);

    // the next two lines added based on @Ian's comment below
    console.log("_doc == document: %s", _doc == document);
    console.log("_doc == doc:      %s", _doc == doc);

    console.log("name: " + window.name + "\n" + "window.vanishing_global: " + window.vanishing_global + "\ntypeof window.vanishing_global: " + typeof window.vanishing_global + "\ndocument.foobar: " + document.foobar);
    this.body.appendChild(js);
  };
  doc.write('');
  doc.close();
})();





И вот:test-vanishing-global.js
console.log("name: " + window.name + "\n" + "window.vanishing_global: " + window.vanishing_global + "\ntypeof window.vanishing_global: " + typeof window.vanishing_global + "\ndocument.foobar: " + document.foobar);
Инструкции:

Поместите эти два файла в каталог и откройте HTML в браузере (протестировано в последних версиях Chrome и Firefox, результат одинаков для обоих).

Это вывод, который я получаю:
this == document: false
this == doc:      true
_doc == document: true
_doc == doc:      false

name: foobar
window.vanishing_global: 1366037771608
typeof window.vanishing_global: number
document.foobar: barfoo:0.9013048021588475

name: 
window.vanishing_global: undefined
typeof window.vanishing_global: undefined
document.foobar: foobar:0.5015988759696484

this Объект внутри обработчика должен быть либо объектом документа. Этоявляется объект документа, но не тот же объект документа, что и документ, внутри которого он выполняется (it 'также не совпадает с родительским документом). Объект окна внутри обработчика также не совпадает с объектом окна, который выполняется в JavaScript, загруженном на странице.

Итак, наконец мой вопрос:

Кто-нибудь знает что?что происходит, и как я могу либо получить ссылку на фактический объект окна, либо хотя бы объявить и ссылаться на глобальную переменную из того же глобального контекста?

Примечания:

В этом iframe нет междоменных проблем, так как онина том же домене. Существует проблема, если кто-то устанавливаетdocument.domain, но это'не делается в этом примере кода.

Ответы на вопрос(1)

Ваш ответ на вопрос