Вопрос по javascript, iframe, html, window, dom – Детский JavaScript:

12

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

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

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

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

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

Ваш Ответ

2   ответа
9

window привязан кdocument: Там есть одинwindow вdocument, и одинdocument вwindow.

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

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

РЕДАКТИРОВАТЬ: Обеwindow.parent а такжеparent.window допустимые выражения, которые возвращают один и тот же объект. Это потому чтоwindow объект являетсяконтекст по умолчанию в сценариях (неквалифицированные имена анализируются как членыwindow), а такжеwindow объекты имеютwindow свойство, которое относится к себе.

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

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

Нужно ли использовать window.parent для доступа к контейнеру ИЛИ parent.window ИЛИ оба действительны? testndtv
There's one window per document, and one document per window, Если вы правы, то чтоwindow.history? Как говорит W3C,window объект является оберткой для многих документов, первым из которых являетсяabout:blank документ, который будет связан с оконным объектом при его создании. Это концепцияbrowsing context. Saeed Neamati
@Sime: я думаю, что вы забылиself где-то там;) Felix Kling
@hmthr: в JavaScript в браузерах, объект window является контейнером всех глобальных переменных. На самом деле,window Символ сам по себе является свойством объекта окна (обращаясь к объекту).parent также является свойством объекта окна, и поэтомуwindow.parent избыточно, можно просто сказатьparent, Тем не менее, это полезно для ясности о том, что вы делаете.parent.window также будет работать, но вводит в заблуждение:parent часть дает вам объект окна вашего родительского окна, нет необходимости идти дальше; а потом вы смотрите вверхwindow опора на него (что относится к нему). T.J. Crowder
@hmthr я рекомендуюwindow.window.parent.window.window...:) Šime Vidas
12

iframeс (иframes) являются собственными окнами, хотя в случае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's <code>foo</code> function.");
      p.foo();
    }
  };

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

};

Похожие вопросы