Объект окна Javascript

В Javascript, скажем, у нас есть главная страница (main.html), которая содержит <iframe> (iframe.html)

Теперь внутри этого iframe.html, если нам нужно ссылаться на что-то на главной странице (main.html) , не можем ли мы просто указать window вместо parent.window

Если нам нужно написать parent.window, я хотел бы понять, нет ли ссылки на объект window для всех iframes на главной странице.

Хотя я понимаю, что document специфичен для отдельных фреймов, но window должен быть общим для всех. Не... Это помогите мне в понимании концепции...

Также есть что-то window.parent? Если да, то как он отличается от parent.window?

Ответ 1

Концепция window привязана к document: там один window за document и один document за window.

Это означает, что элементы <iframe>, у которых есть собственный document, также имеют свой собственный window, как всплывающее окно или главное окно навигатора.

Итак, вам действительно нужно использовать window.parent для доступа к контейнеру элемента <iframe>, так же как вы должны использовать window.opener для доступа к владельцу всплывающего окна.

EDIT: Оба window.parent и parent.window являются допустимыми выражениями, которые возвращают один и тот же объект. Это потому, что объект window является контекстом по умолчанию в сценариях (неквалифицированные имена анализируются как члены window), а объекты window имеют свойство window, которое ссылается на себя.

Итак, parent.window оценивается как window.parent.window, который является тем же объектом, что и window.parent.

Тем не менее, я предпочитаю использовать window.parent, чтобы избежать (минимальных) накладных расходов, связанных с дополнительным доступом к ресурсам.

Ответ 2

iframeframe s) - это их собственные окна, хотя в случае iframe они выглядят как часть основного окна документа. Поэтому да, чтобы ссылаться на окно основного документа, они будут использовать parent (или window.parent, если вы хотите быть подробным, но понятным), потому что это отдельные объекты. Это отчасти необходимо, потому что многие вещи в document заканчиваются как свойства в содержащем window.

Если вы думаете об этом, это имеет смысл: цель iframe заключается в том, чтобы встраивать контент независимо друг от друга на странице. Если на главной странице и iframe (ей) имеется общий объект window, они будут делиться глобальным контекстом и, возможно, конфликтуют друг с другом.

Беспроигрышный живой пример:

Родительский HTML:

<p>I'm the parent window</p>
<iframe width="500" height="500" src="http://jsbin.com/iyogir"></iframe>

Родительский JavaScript:

function foo() {
  display("<code>foo</code> called!");
}
function display(msg) {
  var p = document.createElement('p');
  p.innerHTML = msg;
  document.body.appendChild(p);
}

Детский HTML:

<p>I'm in the frame</p>
<input type='button' id='theButton' value='Click Me'>

Ребенок JavaScript:

window.onload = function() {

  document.getElementById('theButton').onclick = function() {
    var p = window.parent;
    if (!p) {
      display("Can't find parent window");
    }
    else if (typeof p.foo !== "function") {
      display("Found parent window, but can't find <code>foo</code> function on it");
    }
    else {
      display("Calling parent window <code>foo</code> function.");
      p.foo();
    }
  };

  function display(msg) {
    var p = document.createElement('p');
    p.innerHTML = msg;
    document.body.appendChild(p);
  }

};