BOM 和 DOM

什么是 BOM ?

1.瀏覽器對象模型 Browser Object Model

2.BOM的核心對象是window嫉你,同時window也是JavaScript的全局對象

3.BOM主要負責來對瀏覽器窗口進行操作和窗口與窗口之間的交互

主要包括:

navigator 導航器對象、history 歷史對象硕勿、screen阅懦、顯示器對象铆隘、location 對象授艰、對話框梅惯、定時器爱沟、document

navigator

appCodeName 返回瀏覽器的代碼名

appName 返回瀏覽器廠商名稱

appVersion 返回瀏覽器的平臺和版本信息

cookieEnabled 返回瀏覽器是否開啟cookie的布爾值

platform 返回瀏覽器的操作系統(tǒng)平臺

userAgent 返回客戶機發(fā)送到服務器的 user-agent頭部信息

userAgent 可以用來檢測當前瀏覽器型號和版本

history

back() 返回前一個url

forward() 返回下一個url

go(index) 返回具體的某個頁面否灾,正數(shù)是前面的梭依,負數(shù)是后面的稍算,超出返回undefined

screen

avaiHeight 返回顯示器的可用高度

avaiWidth 返回顯示器的可用寬度

Height 返回屏幕的像素高度

Width 返回屏幕的像素寬度

colorDepth 返回屏幕的顏色位數(shù)

window.screen.width/height//在移動端可以獲取到設備的屏幕寬高

注意這些屬性都是只讀的。

location

屬性

hash 設置或者返回從#開始的URL

host 返回主機和當前URL的端口號

hostname 返回不帶端口號的服務器名稱

href 設置或者返回完整的URL役拴,location對象的toString()方法也可以返回這個值

pathname 設置或者返回URL的路徑部分

search 返回從?到#號之間包括?的URL查詢字符串

port 返回URL中指定的端口號糊探,如果不存在返回 ""

方法

assign(url) 打開新的URL并在瀏覽器歷史記錄里生成一條記錄,如果用location.href 或者 window.location 也是調(diào)用這個方法

reload() 重新加載當前頁面 (刷新)

replace() 用新的文檔替換當前文檔河闰,(替換歷史記錄)

定時器

setInterval(fn,delay) ===> clearInterval(index)

setTimeout(fn,delay) ===> clearTimeout(index)

彈窗科平、對話框

alert()

confirm() 確定返回true 取消返回false

prompt() 確定返回輸入的文本 取消返回null

焦點事件

focus 窗口 聚焦

blur 窗口失焦

// 應用:定時器的開關(guān)

window.onfocus=function(){};

window.onblur=function(){};

窗口尺寸和滾動條

window.innerWidth/window.innerHeight 瀏覽器文檔的可視寬高

window.outerWidth/window.outerHeight 瀏覽器窗口的可視寬高

window.pageXOffset/window.pageYOffset 瀏覽器滾動條的滾動距離

如果需要兼容按照下面的做法:(以縱向滾動條為例)

varsTop=window.pageYOffset||document.body.scrollTop||document.documentElement.scrollTop

scrollTo(x,y) 方法可以將滾動條移動到指定位置

此方法只在文檔加載的時候可以自動觸發(fā),文檔加載完成姜性,頁面刷新是無法觸發(fā)的瞪慧,解決辦法:放到定時器里。

(function(win){

vartimer=setInterval(function(){

if(win.pageYOffset>0){

win.scrollTo(0,0);

}else{

clearInterval(timer);

}

},20)

})(window)

DOM

1.文檔對象模型 Document Object Model

2.一套HTML和XML提供的API(應用程序編程接口)

3.DOM描述了一個層次化的節(jié)點部念,允許添加弃酌、移除、修改頁面中的某個部分儡炼。

節(jié)點層次

DOM可以將任何HTML或者XML文檔描繪成一個由多層節(jié)點構(gòu)成的結(jié)構(gòu)妓湘。節(jié)點分為不同的類型,這里咱們主要學習HTML中的節(jié)點類型射赛。

Document

可以將上面這個簡單的HTML文檔表示為一個層次結(jié)構(gòu):

DOM1級定義了一套Node接口多柑,這套接口將由DOM的所有的節(jié)點來實現(xiàn)。在JS中這套接口是由Node接口來實現(xiàn)的(不懂得話楣责,可以無視這句話)竣灌。

每個節(jié)點都有一個nodeType屬性,用來判斷這個節(jié)點是個什么類型

主要要掌握的節(jié)點類型:

元素節(jié)點 對應數(shù)字 1 #Element null

屬性節(jié)點 對應數(shù)字 2 #attr value

文本節(jié)點 對應數(shù)字 3 #text value

注釋節(jié)點 對應數(shù)字 8 #comment value

文檔節(jié)點 對應數(shù)字 9 #document null

獲取元素的子節(jié)點

每個節(jié)點都有一個childNodes方法秆麸,用來獲取當前元素的所有子節(jié)點(可以用item()也可以用[])


1

2

3

varbox=document.getElementById('box');

varchilds=box.childNodes;

console.log(childs.length);//9

用 childNodes 獲取到的是當前一層的所有子節(jié)點初嘹,包括文本和注釋節(jié)點。

每個節(jié)點有一個childNodes屬性沮趣,其中保存著一個NodeList對象,NodeList是一種類數(shù)組對象屯烦,用于保存一組有序的節(jié)點,可以通過為止來訪問這些節(jié)點。請注意驻龟,雖然可以通過方括號[]的語法來訪問NodeList的值温眉,而且這個對象也有l(wèi)ength屬性,但它并不是Array的實例翁狐。NodeList對象的獨特之處在于类溢,它實際上是基于DOM結(jié)構(gòu)動態(tài)執(zhí)行查詢的結(jié)果,因此DOM結(jié)構(gòu)的變化能夠自動反應在NodeList對象中露懒。我們常說闯冷,NodeList是由生命,有呼吸的的對象懈词,而不是我們第一次訪問它們的某個瞬間拍攝下來的一張快照蛇耀。

每個節(jié)點都有nodeName和nodeValue屬性,分別用來獲取節(jié)點的名字和節(jié)點的值坎弯,對于文檔節(jié)點和元素節(jié)點纺涤,獲取到的nodeValue永遠都是null,對于注釋節(jié)點文本節(jié)點獲取到的就是它們本身荞怒。

一張圖看懂各個節(jié)點之間的關(guān)系:

操作元素節(jié)點

創(chuàng)建元素節(jié)點

document.createElement(tag)

創(chuàng)建文本節(jié)點

document.createTextNode(text)

全部都是 父級.方法 剪切操作 返回添加的節(jié)點 剪切后的事件依然存在

appendChild(node) 向父節(jié)點最后添加節(jié)點

insertBefore(new,old) 向某個元素前面添加節(jié)點洒琢,如果第二個參數(shù)是null那么它的功能就是appendChild。

replaceChild(new,old) 替換節(jié)點

removeChild(node) 刪除節(jié)點

克隆節(jié)點

cloneNode(boolean)不寫參數(shù)默認false只克隆當前節(jié)點褐桌,寫true的話會進行深度復制。但是不會復制事件象迎。

操作文本節(jié)點

全部都是 文本節(jié)點.方法 返回添加的節(jié)點

appendData(text) 將text添加到節(jié)點的末尾

deleteData(offset,count) 從offset指定的位置開始刪除count個字符

insertData(offset,text) 在offset指定的位置插入text

replaceData(offset,count,text) 用text替換從offset指定的位置開始到 offset + count為止處的文本荧嵌。

document 的一些屬性和方法

document.documentElement ===> html

document.body ===> body

document.image ===> 文檔中所有圖片的集合

document.from ===> 文檔中所有表單元素的集合

document.links ===> 文檔中所有鏈接a元素的集合

元素的屬性操作

ele.getAttribute('attr') 獲取元素的某個屬性

ele.setAttribute('attr',value) 給元素設置屬性

ele.removeAttribute('attr') 刪除元素身上的某個屬性

以上這些方法操作的都是元素標簽身上的屬性,用 ele.attr 的是無法獲取和設置的砾淌,對應設置節(jié)點屬性啦撮,如果使用大寫的字符,會自動轉(zhuǎn)換成小寫汪厨。

ele.style獲取的是style對象赃春,getAttribute('style') 獲取到的是后面的字符串。

ele.src 獲取絕對路徑 getAttribute('src') 獲取到的src后面的字符串

獲取元素的屬性集合: ele.attributes (可以用item()也可以用[],然后使用nodeName獲取對應的屬性名劫乱,使用nodeValue獲取元素的屬性值)

HTML5新增的自定義屬性 使用 data-name="value" 注意 如果是這種格式的:data-hello-world 會轉(zhuǎn)換為 helloWorld ,在JS中使用ele.dataset可以獲取到元素自定義屬性的一個對象织中,這個對象不是類數(shù)組。

獲取元素節(jié)點

node.children 獲取節(jié)點下的所有元素節(jié)點

node.firstElementChild 獲取節(jié)點下的第一個元素節(jié)點

node.lastElementChild 獲取節(jié)點下的最后一個元素節(jié)點

node.previousElementSibling 獲取元素的上一個兄弟節(jié)點

node.nextElementSibling 獲取元素的下一個兄弟節(jié)點

兩個動態(tài)獲取元素的方法:

document||content.getElementsByTagName(tag)

document||content.getElementsByClassName(class1 class2 ...)

classList 對象

通過 元素.classList 獲取到當前元素的class列表 (類數(shù)組)

在這個對象下有4個方法

add(class) 將指定的字符串添加到class列表中

contains(class) 判斷列表中是否有某個class

remove(class) 移除某個class

toggle(class) 如果列表中已經(jīng)存在就刪除返回false衷戈,否則添加返回true

對表格的操作

vartab=document.getElementById('table');

tab.tBodies[0].rows[0].cells[0]

以下全部為 #tableElement.方法

createTHead() 創(chuàng)建thead元素狭吼,并自動插入

createTFoot() 創(chuàng)建tfoot元素,并自動插入

createCaption() 創(chuàng)建caption殖妇,并自動插入

deleteTHead() 刪除thead元素

deleteTFoot() 刪除tfoot元素

deleteCaption() 刪除caption元素

insertRow(pos) 向rows合集中插入一行

rows.insertCell(pos) 向cells合集中插入一個單元格

獲取元素的寬高和位置

ele.getBoundingClientRect()//返回一個對象刁笙,對象里面有元素的絕對 left\top\bottom\right 以及元素的 width 和 height

詳解 offset client scroll

相關(guān)參考

http://blog.csdn.net/lzding/article/details/46371609

http://www.jb51.net/article/32801.htm

代碼示例:

offsetWidth、clientWidth、width疲吸、scrollWidth區(qū)別及js與jQuery獲取的方式

vardivObj=document.getElementById("div");

vardOffsetWidth=divObj.offsetWidth;//返回元素的寬度(包括元素寬度座每、內(nèi)邊距和邊框,不包括外邊距)

var$dOffsetWidth=$(divObj).outerWidth(false);//參數(shù)為true摘悴,包括外邊距

vardOffsetHeight=divObj.offsetHeight;//返回元素的高度(包括元素高度峭梳、內(nèi)邊距和邊框,不包括外邊距)

var$dOffsetHeight=$(divObj).outerHeight(false);//參數(shù)為true烦租,包括外邊距

vardClientWidth=divObj.clientWidth;//返回元素的寬度(包括元素寬度延赌、內(nèi)邊距,不包括邊框和外邊距)

var$dClientWidth=$(divObj).innerWidth();

vardClientHeight=divObj.clientHeight;//返回元素的高度(包括元素高度叉橱、內(nèi)邊距挫以,不包括邊框和外邊距)

var$dClientHeight=$(divObj).innerHeight();

vardWidth=divObj.style.width;//返回元素的寬度(包括元素寬度,不包括內(nèi)邊距窃祝、邊框和外邊距)

var$dWidth=$(divObj).width();//width(val)設置寬

vardHeight=divObj.style.height;//返回元素的高度(包括元素高度掐松,不包括內(nèi)邊距、邊框和外邊距)

var$dHeight=$(divObj).height();//height(val)設置高

vardscrollWidth=divObj.scrollWidth;//返回元素的寬度(包括元素寬度粪小、內(nèi)邊距和溢出尺寸大磺,不包括邊框和外邊距),無溢出的情況探膊,與clientWidth相同

vardscrollHeight=divObj.scrollHeight;//返回元素的高度(包括元素高度杠愧、內(nèi)邊距和溢出尺寸,不包括邊框和外邊距)逞壁,無溢出的情況流济,與clientHeight相同

console.log("dOffsetWidth:"+dOffsetWidth+",dOffsetHeight:"+dOffsetHeight+",dClientWidth:"+dClientWidth+",dClientHeight:"+dClientHeight+",dWidth:"+dWidth+",dHeight:"+dHeight+",dscrollWidth:"+dscrollWidth+",dscrollHeight:"+dscrollHeight);

console.log("$dOffsetWidth:"+$dOffsetWidth+",$dOffsetHeight:"+$dOffsetHeight+",$dClientWidth:"+$dClientWidth+",$dClientHeight:"+$dClientHeight+",$dWidth:"+$dWidth+",$dHeight:"+$dHeight);

/*

注意:offsetWidth(offsetHeight)與style.width(style.height)的區(qū)別

1. style.height 返回的是字符串,如28px腌闯,offsetWidth返回的是數(shù)值28绳瘟,如果需要對取得的值進行計算,用offsetWidth比較方便;如果拿到offsetWidth設置style.left的值姿骏,需加'px'糖声。

2. style.width/style.height與scrollWidth/scrollHeight是可讀寫的屬性,clientWidth/clientHeight與offsetWidth/offsetHeight是只讀屬性

3. style.height的值需要事先定義分瘦,否則取到的值為空蘸泻。而且必須要定義在html里,如果定義在css里擅腰,style.height的值仍然為空蟋恬,但元素偏移有效;而offsetWidth則仍能取到趁冈。

*/

/*

總結(jié):

1歼争、通過style.width(style.height)或者jQuery的$(divObj).width()/$(divObj).height()獲取/設置元素的寬高

2拜马、若要獲取元素包含邊框的寬度,則可通過divObj.offsetWidth/divObj.offsetHeight或jQuery的$(divObj).outerWidth(false)/$(divObj).outerHeight(false)獲取

3沐绒、通過$(divObj).outerWidth(true)/$(divObj).outerHeight(true)獲取帶外邊距的寬度

4俩莽、通過$(divObj).innerWidth()/$(divObj).innerHeight()獲取不包含邊框、不包含外邊距的寬度

*/

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末乔遮,一起剝皮案震驚了整個濱河市扮超,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌蹋肮,老刑警劉巖出刷,帶你破解...
    沈念sama閱讀 217,406評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異坯辩,居然都是意外死亡馁龟,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評論 3 393
  • 文/潘曉璐 我一進店門漆魔,熙熙樓的掌柜王于貴愁眉苦臉地迎上來坷檩,“玉大人,你說我怎么就攤上這事改抡∈噶叮” “怎么了?”我有些...
    開封第一講書人閱讀 163,711評論 0 353
  • 文/不壞的土叔 我叫張陵阿纤,是天一觀的道長句灌。 經(jīng)常有香客問我,道長欠拾,這世上最難降的妖魔是什么涯塔? 我笑而不...
    開封第一講書人閱讀 58,380評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮清蚀,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘爹谭。我一直安慰自己枷邪,他們只是感情好,可當我...
    茶點故事閱讀 67,432評論 6 392
  • 文/花漫 我一把揭開白布诺凡。 她就那樣靜靜地躺著东揣,像睡著了一般。 火紅的嫁衣襯著肌膚如雪腹泌。 梳的紋絲不亂的頭發(fā)上嘶卧,一...
    開封第一講書人閱讀 51,301評論 1 301
  • 那天,我揣著相機與錄音凉袱,去河邊找鬼芥吟。 笑死侦铜,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的钟鸵。 我是一名探鬼主播钉稍,決...
    沈念sama閱讀 40,145評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼棺耍!你這毒婦竟也來了贡未?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,008評論 0 276
  • 序言:老撾萬榮一對情侶失蹤蒙袍,失蹤者是張志新(化名)和其女友劉穎俊卤,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體害幅,經(jīng)...
    沈念sama閱讀 45,443評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡消恍,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,649評論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了矫限。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片哺哼。...
    茶點故事閱讀 39,795評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖叼风,靈堂內(nèi)的尸體忽然破棺而出取董,到底是詐尸還是另有隱情,我是刑警寧澤无宿,帶...
    沈念sama閱讀 35,501評論 5 345
  • 正文 年R本政府宣布茵汰,位于F島的核電站,受9級特大地震影響孽鸡,放射性物質(zhì)發(fā)生泄漏蹂午。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,119評論 3 328
  • 文/蒙蒙 一彬碱、第九天 我趴在偏房一處隱蔽的房頂上張望豆胸。 院中可真熱鬧,春花似錦巷疼、人聲如沸晚胡。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,731評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽估盘。三九已至,卻和暖如春骡尽,著一層夾襖步出監(jiān)牢的瞬間遣妥,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,865評論 1 269
  • 我被黑心中介騙來泰國打工攀细, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留箫踩,地道東北人爱态。 一個月前我還...
    沈念sama閱讀 47,899評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像班套,于是被迫代替她去往敵國和親肢藐。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,724評論 2 354

推薦閱讀更多精彩內(nèi)容

  • 數(shù)組定義 數(shù)組是值的有序集合 javascript數(shù)組是無類型的吱韭;數(shù)組元素可以是任意類型吆豹,并且同一個數(shù)組的不同元素...
    恩德_b0c2閱讀 267評論 0 0
  • DOM 變化 如何確認瀏覽器是否支持 DOM 2 和 DOM 3 新增的模塊:var supportsDOM2Co...
    云之外閱讀 468評論 0 0
  • 原文 https://www.kancloud.cn/dennis/tgjavascript/241852 一、節(jié)...
    LuckyS007閱讀 853評論 0 0
  • BOM全稱為Browser Object Model,譯為瀏覽器對象模型理盆。 作用:用于訪問和操作瀏覽器窗口痘煤,使ja...
    大笑一聲閱讀 741評論 0 0
  • 第一眼感覺 大概就是這人很痛苦,痛苦到他也不能眠猿规≈钥欤或者這人是被噩夢所驚醒,讓他久久不能從夢中走出姨俩。 第二次講...
    哈小粉閱讀 806評論 0 0