當你建立一個新視窗時,給open()方法的傳回值分配一個變數非常重要。比如,下面的語句建立一個新視窗,然後立即關閉它:
win = window.open("http://www.docjs.com/", "js");
win.close();
Window對象
每一個瀏覽器視窗都與一個清楚地window對象對應,所以,當你想引用當前視窗時,你應該使用window對象。下面的語句設定當前視窗的URL:
window.location.href = "http://www.docjs.com/";
當你在指令碼程式中放置這樣一個語句時,你不需要指定window對象,因為當前視窗的存在是預設的:
location.href = "http://www.docjs.com/";
注意,self等價於window,所以,self.close()實際上就等於window.close()。
當你想操縱一個視窗時,你必須確認它是存在的。在為window.open()方法定義一個變數時,要將它定義為全域變數並設定為null。記住,open()方法返回新視窗的window對象。這裡是一個例子:
var win = null;
function launchWindow() {
win = window.open();
// statements that refer to the new window go here
}
如果你想對新視窗執行一個操作,你首先應該檢查變數win是否為null:
// if win exists, move the window
if (win) win.moveTo(0, 0);
注意,null等於false,同時任何其他合法的對象等價於true。如果win等於true,你就知道了它不是null,這意味著新視窗成功地建立了。
open "屬性"
現在你知道了瀏覽器實際建立了新視窗。但是它仍然存在嗎?不是必須的。你需要確認可用的視窗的確擁有一個真正的window對象。既然每個window對象對應於一個open()方法,你就可以通過對象探測檢查到這個方法:
// 如果win.open存在,就移動視窗
if (win.open) win.moveTo(0, 0);
變數win對照視窗的window對象,所以win.open對應window的window.open方法。注意,條件運算式是一個函數引用,不是一個函數調用。除非你確認win存在,你不應該試圖估計win.open。下面的語句描述了正確的執行方法:
// if win and win.open exist, move the window
if (win && win.open) win.moveTo(0, 0);
由於&&是一個短操作符號,如果第一個參數(win)對應於true,那麼結果就取決於第二個數值。如果第二個參數是false,那麼整個運算式結果就是false。這是一個很重要的行為,因為如果win不存在,那麼運算式win.open就會產生一個錯誤。
closed 屬性
由於JavaScript的第一個版本,瀏覽器視窗成為一個非常困難的問題。比如,一個window對象的一些方法,例如close(),即使當視窗已經關閉時也能被執行,同時另外一些卻不能(比如moveTo())。但是情況會更糟。Internet Explorer和Navigator經常有不同的行為。而且,預測一定操作的結果經常是非常困難的,即使你以前已經做過類似的嘗試。我們將告訴你如何克服這些困難,方法就是介紹一個在交叉瀏覽器中能應用的語句,它將檢查一個給定的視窗是否被開啟。
window.closed屬性是一個Boolean型數值,它定義了是否視窗已經被關閉。當視窗被關閉時,window對象依然存在,並且它的closed屬性已經被設定為true。
使用closed來判斷開啟的視窗以及仍能夠被引用(從window.open方法返回的數值)的視窗是否仍然開啟著。當視窗關閉時,你不應該試圖再操縱它。因為window.closed僅僅被Internet Explorer 4、Navigator 3 和高版本所支援,所以你應該注意前面的版本問題。我們將使用下面的代碼:
// if win and win.open exist, and win.closed isn't true, move the window
if (win && win.open && !win.closed) win.moveTo(0, 0);
Internet Explorer 3 和 Navigator 2 不支援 closed 方法,所以它在Boolean型運算式中等價於false (就像其他不存在地屬性一樣,比如 window.tomershiran)。