2011-07-13 76 views
11

在Javascript中,假設我們有一個主網頁(main.html),其中包含一個(iframe.htmlJavaScript window對象

現在這個iframe.html裏面,如果我們需要參考一些主要頁面(main.html) 上,我們不能只指定的window代替parent.window

如果答案是我們需要寫parent.window,我想了解有沒有爲主頁中的所有iFrame的單一window對象引用..

雖然我明白document是具體到單個I幀,但window應該是共同的all..Isn't它...請幫助我理解這個概念...

而且是有什麼window.parent爲好 ?如果是,它與parent.window有什麼不同?

回答

8

window概念是聯繫在一起的document:有一個windowdocument,和一個documentwindow

這意味着元素擁有自己的document,它們也具有自己的window,就像彈出窗口或主導航窗口一樣。

因此,您必須使用window.parent來訪問元素的容器,就像您必須使用window.opener來訪問彈出窗口的所有者一樣。

編輯:window.parentparent.window是返回相同對象的有效表達式。這是因爲window對象是腳本中的默認上下文(非限定名稱被解析爲window的成員),而window對象具有引用自身的window屬性。

因此,parent.window評估爲window.parent.window,它與window.parent的目標相同。

也就是說,我更喜歡使用window.parent,以避免與額外的財產訪問相關的(最小)開銷。

+0

我必須使用window.parent訪問容器或parent.window或兩者都有效嗎? – testndtv

+2

@hmthr我推薦'window.window.parent.window.window' ...':)' –

+0

@hmthr:在瀏覽器的JavaScript中,窗口對象是所有全局變量的容器。實際上,'window'符號本身就是窗口對象的一個​​屬性(指向對象)。 'parent'也是窗口對象的一個​​屬性,所以'window.parent'是多餘的,你可以說'parent'。但是,清楚你在做什麼是很有用的。 'parent.window'也可以工作,但是以一種令人誤解的方式:'parent'部分爲您提供了父窗口的窗口對象,不需要繼續;然後你正在查看它的'window'道具(它指向它)。 –

10

iframe s(和frame s)是他們自己的窗口,即使在iframe的情況下,它們看起來像是主文檔窗口的一部分。所以是的,要引用主文檔的窗口,他們會使用parent(或window.parent,如果您想冗長但明確),因爲它們是單獨的對象。這是部分必要的,因爲document中的很多內容最終會作爲包含window的屬性。

如果您仔細考慮它,那麼這是有道理的:iframe的目的是在頁面中嵌入獨立來源的內容。如果主頁和其上的iframe(s)共享一個單一的window對象,則它們將共享全局上下文,並且很可能相互衝突。

無償live example

家長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'> 

孩子的JavaScr IPT:

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); 
    } 

};