Объект окна 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
iframe
(и frame
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);
}
};