2008年12月28日 星期日

HTML DOM 裡的window物件

在web page裡的DOM是這樣排列的 window->document->html 接下來就是 head跟body
而且window.open()這個mothod 不只會新開出一個視窗(或是頁面) 更會回傳被開出來的視窗的DOM tree的window物件
也就是如果用 var s=window.open("http://www.example.com/a.html"); 接下就可以用s.document."some object or some method"
去存取那個新開視窗下面的DOM物件
但是 雖說是可以存取 但還是有某些限制 例如same origin policy的問題
若是被開出來的視窗已經換到不同的origin(port domain protocol)去了 那就不能對這個視窗做存取的動作了

還有就是時間的問題 例如想要讀取新開出來的window的url 如果直接這樣寫
var s=window.open("http://www.example.com/a.html");
alert(s.location.href);
這樣會得出 about:blank
我猜想是因為 執行到 alert(s.location.href); 這一行時 http://www.example.com/a.html的DOM tree的資料結構還沒構建好
若是這樣用 setTimeout("alert(s.location.href)", 1*1000); 澤就可以正確顯示出 http://www.example.com/a.html 了

然而 被新開出來的視窗 也可以利用window.opener來取得開出此視窗的視窗的window物件(姑且稱為父視窗)
同樣得 有了window物件 也可以存取自己的父視窗下的DOM物件
當然 上述的情況都要符合same origin policy才行

沒有留言:

張貼留言