javascript高級程序設計讀書筆記(八)

BOM

NO.1 window對象

BOM的核心對象是window,它表示瀏覽器的一個實例。在瀏覽器中,window對象有雙重角色,它既是通過JavaScript訪問瀏覽器窗口的一個接口,又是JS規(guī)定的Global對象。

全局變量會變成window對象的屬性。
另外,全局變量不能通過delete刪除,但是在window上定義的屬性可以,在window上定義的屬性還有一個好處就是當變量未聲明的時候,訪問的時候不會報錯。

var newValue = oldValue; //報錯
var newValue = window.oldValue //不報錯

NO.2 窗口關系及框架

如果頁面中包含框架,那么每個框架都有自己的window對象,保存在frames集合中。


要訪問上面的框架,可以使用
window.frames[0]
window.frames["topFrame"]
top.frames[0]
top.frames["topFrame"]
frames[0]
frames["topFrame"]

最好使用top.frames[0]來引用

和top相對的另一個window對象是parent對象,parent對象始終執(zhí)行當前框架的直接上層。

窗口位置:
使用如下代碼可以取得窗口左邊和上邊的位置。

var leftPos = (typeof window.screenLeft == "number") ? window.screenLeft : window.screenX;
var topPos = (typeof window.screenTop == "number") ? window.screenTop : window.screenY;

首先確定screenLeft和screenTop是否存在(在Safari、Opera和Choreme中)則取這兩個屬性的值,如果不存在(在Firefox中),則取得screenX和screenY的值

窗口大?。?br> 四個瀏覽器都提供了四個屬性: innerWidth,innerHeight,outerWidth,outerHeight

當pageWidth不是一個數(shù)值的時候,就是用window.innerWidth取不到的時候,然后判斷頁面是否處于標準模式,如果是標準模式,用上圖那種方式取得瀏覽器寬度,如果不是,用另外一種。

用reszieTo()和resizeBy()方法可以調整瀏覽器窗口的大小。其中resizeTo()接收瀏覽器的新寬度和新高度。resizeBy()方法接收高度差。

導航和打開新窗口:
使用window.open()方法可以導航到一個特定的URL,也可以打開一個新的瀏覽器的窗口。
這個方法可以接受四個參數(shù):要加載的URL,窗口目標,一個特性字符串以及一個布爾值(表示新頁面是否取代瀏覽器歷史記錄中當前加載頁面)
close()方法可以關閉新打開的窗口。

大多數(shù)瀏覽器都有屏蔽彈出窗口程序,如果窗口被內置的屏蔽程序阻止了。你們window.open()會返回null。此時,只要檢測這個值就可以確定彈出的窗口是否被屏蔽。
如果是內置屏蔽程序(window.open ==null):

var wroxWin = window.open("http://young.club", "_blank");
if (wroxWin == null){
    alert("彈出窗口被瀏覽器內置屏蔽程序阻止");
}

如果是瀏覽器擴展或者其他程序阻止(window.open報錯):

var blocked = false;
try{
    var wroxWin = window.open("http://youngi.club","_blank")
    if(wroxWin==null){
        blocked == true;
    }
} catch (ex){
    blocked == true;
}

if (blocked){
    alert("窗口被攔截");
}

間歇調用和超時調用:
javascript是單線程語言,它允許設置超時值和間歇時間來調度代碼在特定時刻執(zhí)行。
超時調用需要使用window對象的setTimeout()方法,它接受兩個參數(shù),要執(zhí)行的代碼以及毫秒。
不建議的方式(原因,傳遞字符可能導致性能損失):

setTimeout("alert('hello world')", 1000);

建議的方式:

setTimeout(function(){
    alert("hello world!");
    },1000);

調用setTimeout后,該方法會返回一個數(shù)值ID,表示超時調用,這個ID是計劃執(zhí)行代碼的唯一標示符,可以用來取消超時調用

var timeoutId = setTimeout(function(){
    alert("hello world!");
    },1000);
ClearTimeout(timeoutId);

類似,間隙調用:

var setInterval = setTimeout(function(){
    alert("hello world!");
    },1000);
ClearInterval(setInterval);

系統(tǒng)對話框:
alert()和confirm(),prompt()可以調用系統(tǒng)對話框向用戶顯示消息,系統(tǒng)對話框的外觀由瀏覽器設置或者操作系統(tǒng)決定。

NO.3 location對象

location是最有用的BOM對象之一。它提供了與當前窗口加載的文檔有關的信息,他還提供了一些導航功能。它既是window對象的屬性,也是document對象的屬性。
location可以將URL解析為獨立的片段,讓開發(fā)人員通過不同的屬性訪問這些片段。
location.search可以訪問從問號到URL末尾的所有內容。
location.assign("http://youngi.club")可以立即打開新的URL

location.assign("http://youngi.club")
window.location = "http://youngi.club"
location.

這三條語句等價

location屬性還可以對URL進行一系列操作,如下:


這個時候如果用戶點擊后退按鈕,還是能回到前一個頁面,如果想要禁止這種行為,可以用replace()方法。

setTimout(function(){
    location.replace("http://youngi.club")
},1000)

reload()方法,重載當前頁面,當沒有參數(shù)的時候,會自動從緩存中重新加載,如果需要從服務器加載,需要傳遞參數(shù)true,reload()方法最好放在最后一行,因為它會導致它之后的代碼不執(zhí)行

location.reload(); //從緩存加載
location.reload(true); //從服務器加載

NO.4 navigator對象

navigator對象包含的屬性描述了正在使用的瀏覽器
navigator.plugins[]表示瀏覽器所用的插件的集合

NO.5 screen對象

screen對象基本上只是用來表明客戶端的能力,包含瀏覽器窗口外部顯示器的信息,如像素高寬

NO.5 history對象

history對象保存中用戶上網的歷史記錄,處于安全考慮,開發(fā)人員無法得知用戶瀏覽過的URL。使用go方法可以在用戶的歷史記錄中任意跳轉:

history.go(-1); //后退一頁
history.go(3); //前進三頁
history.go("youngi.club"); //跳到最近的youngi.club頁面

history還有一個length屬性,保存歷史記錄的數(shù)量

if(history.length == 0){
    //是用戶打開窗口的第一個頁面
}

NO.6 客戶端檢測

因為瀏覽器多樣性,所以需要客戶端檢測方法,來突破或者規(guī)避種種局限性。
舉個例子,在IE5.0之前的版本不支持document.getElementById()這個DOM方法,所以要使用document.all這個非標準的屬性實現(xiàn)相同目的。
能力檢測代碼:

function getElement(id){
    if (document.getElementById){
        return document.getElementById(id);
    } else if(document.all){
        return document.all[id];
    } else{
        throw new Error {"沒辦法獲取到元素"}
    }
}

NO.7 客戶端完整代碼

見Javascript高級程序設計(第三版)242頁~245

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容