《JavaScript高階程式設計》——DOM
阿新 • • 發佈:2019-02-19
對程式碼的理解全部寫在了註釋中
8.js
/* * BOM - * - 框架(每個框架包含自己的window物件) * - window物件(主要) :視窗資訊 * - location物件 :文件資訊 * - navigator物件 :瀏覽器資訊 * - screen物件 :客戶端資訊 * - history物件 :歷史資訊 */ //在全域性作用域中宣告的變數,函式會變成windows物件的屬性和方法(windows物件就代表著全域性作用域)。 var age = 29; function sayAge() { console.log(this.age); } sayAge(); //29 window.sayAge(); //29 console.log(window.age == age); //true sayAge方法被歸到了window下。 //區別:刪除在全域性作用域中定義的屬性和變數會產生失敗。而刪除window物件下的不會。 var age = 29; window.color = "red"; console.log(delete window.age); //false:因為是直接定義的,所以不能刪除。 console.log(delete window.color); //true:由windows定義的,可以刪除。 console.log(window.age); //29:未被刪除。 console.log(window.color); //undifined:已被刪除。 //原因:使用var語句新增的屬性[Configurable]預設為false,所以不可被刪除。 console.log(oldValue); //出錯 :因為沒被定義。 console.log(window.oldValue); //undefined:不會跑出錯誤,因為這是一次屬性查詢。 //可以通過查詢window物件地方法可以知道某個未宣告的變數是否存在 //框架 (frame.html)<span> </span>不貼到部落格裡了,只做了幾個簡單的例子,寫的還特醜<span style="color: rgb(51, 51, 51); font-family: arial; font-size: 13px; line-height: 20.02px;"> _(:3 」∠)_ </span> /* * window物件 * - 視窗位置: window.screenLeft/window.screenTop FireFox: window.ScreenX/window.ScreenY * - 視窗大小: window.innerWidth/window.innerHeight/window.outerWidth/window.outerHeight * - 調整瀏覽器視窗大小: window.resizeTo()/window.resizeBy() * - 開啟視窗: window.open() */ //視窗位置 //IE,Safari,Opera,Chrome:screenLeft和scrrenTop。 //FireFox: :ScreenX和ScreenY //跨瀏覽器取得左邊和上邊的位置: var leftPos = (typeof window.screenLeft) == "numer"? window.screenLeft:window.screenX; var topPos = (typeof window.screenTop) == "number"? window.screenTop:window.screenY; console.log(leftPos+"..."+topPos); //"392...147"從顯示器左端到頁面的距離和從顯示器上端到頁面的距離。 console.log(parent == top); //true:由於沒有框架,parent框架就等於top(瀏覽器視窗)。 //IE,Opera:到頁面可見區域的舉例(如果頁面緊貼上邊,screenY就是導航欄的高度)。 //Firefox,Safari,Chrome:到整個瀏覽器視窗的距離(頁面緊貼上邊,screenY返回0)。 //視窗大小 //四個屬性:innerWidth,innerHeight,outerWidth,outerHeight //OuterWidth,OuterHeight: //IE9+,Safari,Firefox: 返回瀏覽器視窗的尺寸。 //Opera: 返回頁面檢視容器(單個標籤頁對應的瀏覽器視窗)的大小。 //Opera中,innerWidth和innerHeight返回頁面檢視區(頁面檢視容器減去邊框寬度)的大小。 //Chrome中,inner的兩個屬性和outer的兩個屬性返回相同的值:視口(viewport)大小 //跨平臺確定頁面視口的大小 var pageWidth = window.innerWidth; var pageHeight = window.innerHeight; if(typeof pageWidth != "number") { //如果不是數值,則檢查是否處於標準模式(第十章討論)。 if(document.compatMode != "CSS1Compat") { pageWidth = document.documentElement.clientWidth; //是標準模式。 pageHeight = document.documentElement.clientHeight; } else { pageWidth = document.body.clientWidth; //非標準模式。 pageHeight = document.body.clientHeight; } } //對於移動裝置,window.innerWidth和window.innerHeight儲存著可見視口。 //不支援這些屬性的瀏覽器,儲存在document.body.clientWidth和document.body.clientHeight中 //調整瀏覽器視窗的大小。 //resizeTo()和resizeBy() //其中resizeTo()接收瀏覽器視窗的新寬度和新高度。 //resizeBy()接受新視窗與原視窗的寬度和高度之差。 window.resizeTo(100,100); //調整到100*100 window.resizeBy(100,150); //調整到200*250 window.resizeTo(300,300); //調整到300*300 //開啟視窗: var wroxWin = window.open("http:///www.wrox.com/"); //會彈出一個視窗 //第一個引數:視窗URL。 //第二個引數:在哪個框架中開啟。 //返回一個對該視窗的引用,可以通過這個引用操作視窗。 console.log(wroxWin.opener); var wroxWin = window.open("http:///www.wrox.com/"); wroxWin.close(); //該視窗被關閉。 console.log(wroxWin.closed); //true:已被關閉。 console.log(wroxWin.parent); //window物件。 console.log(wroxWin.parent == wroxWin.top); //true console.log(wroxWin.opener); //window物件啊 //opener屬性儲存著開啟它的原始視窗物件,只在最外層window物件(top)中有定義。 //彈出的視窗與使之彈出的視窗執行在一個程序中。若想單獨執行,需要將彈出視窗的opener設定為null wroxWin.opener = null; //聯絡切斷後,無法恢復。 //彈出視窗遮蔽程式:大多數瀏覽內建有彈出視窗遮蔽程式。 //檢測方法:window.open是否返回null。 var wroxWin = window.open("http:///www.wrox.com/","_blank"); console.log(wroxWin == null); //false:沒有被遮蔽。 //如果是外接工具遮蔽的視窗,瀏覽器會彈出錯誤。此時需要try並處理。 var blocked = false; //用一個變數記錄視窗是否被遮蔽。 try{ var wroxWin = window.open("http:///www.wrox.com/","_blank"); blocked = true; //表示被遮蔽。 }catch(e){ blocked = true; //即使丟擲異常也正常處理 。 } console.log(blocked); /* * 定時器: 超時呼叫 setTimeout * 間歇呼叫 setInterval */ //setTimeOut也可以用字串表示要執行的引數 setTimeout("console.log('executed');",1000); //executed var id = setTimeout(function(){console.log("executed");},1000); //executed //不建議使用字串,有可能帶來效能損失。 //秒數以後不一定會立即執行,只是進入預執行狀態(類似java中的Thread.sleep()) //返回ID用於停止定時器 clearTimeout(id); //未被執行 //間歇呼叫同樣原理:setInterval var num = 0; var max = 10; function inte() { //計時器:從0到10 if(num==max) clearInterval(id); //會沿著作用域鏈自動在全域性環境中尋找id console.log(num++); } var id = setInterval(inte,1000); //用超時呼叫模擬間歇呼叫。 var num = 0; var max = 10; function incrementNumber () { num++; if(num < max) { //不滿足條件之前,每一秒鐘新建一個超時呼叫。 setTimeout(incrementNumber,1000) } else { console.log("Done"); //好處:不用記錄ID。 } } setTimeout(incrementNumber,1000); //在開發中很少真正的使用間歇呼叫,因為後一個間歇呼叫可能在前一個間歇呼叫之前啟動。 //系統對話方塊: //1.外觀由瀏覽器設定決定。 //2.同步和模態:開啟時程式碼停止執行,關閉時程式碼恢復執行。 //alert:彈出框 alert("呵呵!"); //彈出呵呵框 //confirm:確認框。經常在刪除操作時使用。 var sure = confirm("愛我否?"); //返回一個boolean值 if(sure) { //點了OK alert("你果然愛我。"); } else { //點了cancel alert("竟然不愛我,嚶嚶嚶"); } //prompt:輸入框。 var text = prompt("請輸入一段文字。"); if(text){ //如果輸入不為空。 alert("你輸入的文字是'"+text+"'!"); } else { //不輸入或者輸入空值,返回null。 alert("你什麼也沒輸!"); } //chrome:頁面顯示兩個以上對話方塊,可以遮蔽,後續對話方塊都不會顯示。 var i = 0; while(i<5) { alert("煩死你"); i++; } alert("煩死你"); //如果遮蔽,這三種框都不會再顯示 confirm("煩死你"); prompt("煩死你"); //查詢和列印:非同步顯示(不影響頁面載入)。 window.print(); window.find(); //location物件:提供與當前視窗中載入的文件的有關資訊。 console.log(location.hash); //URL後面的hash(#後面的字元,沒有則返回空) console.log(location.host); //帶埠號 console.log(location.hostname); //不帶埠號 console.log(location.href); //地址 console.log(location.pathname); //目錄和檔名 console.log(location.port); //埠號 console.log(location.protocol); //協議 console.log(location.search); //查詢字串 //解析查詢字串的函式: function getQueryStringArgs() { var qs = (loaction.search.length > 0? //檢查查詢字串的長度 location.search.substring(1):""); //有長度則去掉"?"後返回,否則返回空 var args = []; var item = null; var name = null; var value = null; var items = qs.length? qs.split("&"):[]; for(var i=0;i<items.length;i++) { item = items[i].split("="); name = decodeURIComponent(item[0]); //解碼後存入name value = decodeURIComponent(item[1]); //解碼後存入value } if(name.length) { args[name] = value; } return args; } //location物件的位置操作。 location.assign("http://www.wrox.com"); //開啟URL並生成一條歷史記錄 //相當於 window.location = "http://www.wrox.com"; location.href = "http://www.wrox.com"; //還可以用location.hash location.search等方法修改相應屬性(不演示了)。 //都會使頁面重新載入。 //replace()方法(重定位):不會生成歷史記錄。 location.replace("http://www.wrox.com"); //reload()方法:重新載入 reload(); //重新載入(有可能從快取中載入)。 reload(true); //重新載入(一定從伺服器載入)。 //reload之後的程式碼不一定會執行(取決於網路),最好將reload放在程式碼的最後一行。 //navigator物件 瀏覽器資訊(第九章詳細討論) //外掛資訊,存在navigator.plugins陣列內 //屬性: .name:外掛的名字 .description:外掛的描述 .filename:外掛的檔名 .length:外掛所處理的MIME型別數量。 // //迴圈輸出瀏覽器外掛名 for(var i=0;i<navigator.plugins.length;i++) { console.log(navigator.plugins[i].name); } //檢測是否存在指定外掛(使用迭代的方法)(在IE中無效) function hasPlugin(name) { //使用迭代的方法檢測plugins陣列。 name = name.toLowerCase(); //忽略大小寫,便於比較。 for(var i=0;i<navigator.plugins.length;i++) { //遍歷navigator.plugins陣列 if(navigator.plugins[i].name.indexOf(name)) //找到相同name的外掛則返回true return true; } return false; //否則返回false } */ /* //檢測是否存在指定外掛(使用迭代的方法)(IE方法) function hasIEPlugin(name) { //使用專有的ActiveXObject型別,並嘗試建立一個特定外掛的例項。 try{ new ActiveXObject(name); return true; //建立成功則return true }catch(e){ return false; //建立失敗(建立未知物件會導致丟擲異常)則return false } } //由於兩種方法差別太大,如果想通用,就要外掛單獨建立通用的檢測方法 function hasFlash() { //分別使用兩種檢測方法,都為false則返回false,否則返回true var result = hasPlugin("Flash"); if(!result) { result = hasIEPlugin("ShockwaveFlash.ShockwaveFlash") //使用IE的外掛識別符號檢測。 } return result; } //註冊處理程式。 //navigator.registerContentHandler() //處理RSS源 //navigator.registerProtocolHandler() //處理協議 //screen物件:用來表明客戶端的能力(螢幕資料,顏色位數等)。 //history物件:歷史資料。開發人員無法得知使用者瀏覽過的URL,但可以借用history物件模擬。 //go方法:跳轉 history.go(-1); //向後跳轉一頁歷史記錄。 history.go(1); //向前跳轉一頁歷史記錄。 history.go(2); //向前跳轉兩頁歷史記錄。 //傳入字串:跳轉到最近的,包含該字串的網址(可能前進,也可能後退) history.go("wrox.com"); //跳轉到最近的wrox.com中的頁面。 history.back(); //後退一頁,相當於瀏覽器的後退按鈕。 history.forward() //前進一頁,相當於瀏覽器的前進按鈕。 history.length; //長度屬性,儲存著歷史記錄的數量。 if(history.length == 0) { console.log("你一定剛開啟這個頁面!"); //history的長度為0說明是新頁面。 }