BOM 和 DOM

什麼是 BOM ?

1.瀏覽器對象模型 Browser Object Model
2.BOM的核心對象是window,同時window也是JavaScript的全局對象
3.BOM主要負責來對瀏覽器窗口進行操作和窗口與窗口之間的交互


主要包括:
navigator 導航器對象、history 歷史對象、screen、顯示器對象、location 對象、對話框、定時器、document

  • appCodeName 返回瀏覽器的代碼名
  • appName 返回瀏覽器廠商名稱
  • appVersion 返回瀏覽器的平臺和版本信息
  • cookieEnabled 返回瀏覽器是否開啓cookie的布爾值
  • platform 返回瀏覽器的操作系統平臺
  • userAgent 返回客戶機發送到服務器的 user-agent頭部信息

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


history

  • back() 返回前一個url
  • forward() 返回下一個url
  • go(index) 返回具體的某個頁面,正數是前面的,負數是後面的,超出返回undefined

screen

  • avaiHeight 返回顯示器的可用高度
  • avaiWidth 返回顯示器的可用寬度
  • Height 返回屏幕的像素高度
  • Width 返回屏幕的像素寬度
  • colorDepth 返回屏幕的顏色位數
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 也是調用這個方法
    • reload() 重新加載當前頁面 (刷新)
    • replace() 用新的文檔替換當前文檔,(替換歷史記錄)

定時器

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

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

彈窗、對話框

  • alert()
  • confirm() 確定返回true 取消返回false
  • prompt() 確定返回輸入的文本 取消返回null

焦點事件

  • focus 窗口 聚焦
  • blur 窗口失焦
// 應用:定時器的開關
window.onfocus = function(){};
window.onblur = function(){};

窗口尺寸和滾動條

  • window.innerWidth/window.innerHeight 瀏覽器文檔的可視寬高
  • window.outerWidth/window.outerHeight 瀏覽器窗口的可視寬高
  • window.pageXOffset/window.pageYOffset 瀏覽器滾動條的滾動距離
  • 如果需要兼容按照下面的做法:(以縱向滾動條爲例)
var sTop = window.pageYOffset || document.body.scrollTop || document.documentElement.scrollTop
  • scrollTo(x,y) 方法可以將滾動條移動到指定位置
    • 此方法只在文檔加載的時候可以自動觸發,文檔加載完成,頁面刷新是無法觸發的,解決辦法:放到定時器裏。
(function (win){
    var timer = 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描述了一個層次化的節點,允許添加、移除、修改頁面中的某個部分。

節點層次

DOM可以將任何HTML或者XML文檔描繪成一個由多層節點構成的結構。節點分爲不同的類型,這裏咱們主要學習HTML中的節點類型。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
</head>
<body>
    <h2>
        <span></span>
        <span></span>
    </h2>
    <p>
        <a href=""></a>
    </p>
</body>
</html>

可以將上面這個簡單的HTML文檔表示爲一個層次結構:

2.png-60.3kB

DOM1級定義了一套Node接口,這套接口將由DOM的所有的節點來實現。在JS中這套接口是由Node接口來實現的(不懂得話,可以無視這句話)。

每個節點都有一個nodeType屬性,用來判斷這個節點是個什麼類型

主要要掌握的節點類型:

  • 元素節點 對應數字 1 #Element null
  • 屬性節點 對應數字 2 #attr value
  • 文本節點 對應數字 3 #text value
  • 註釋節點 對應數字 8 #comment value
  • 文檔節點 對應數字 9 #document null

獲取元素的子節點

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

<body>
    <div id="box">
        <!-- 註釋 -->
        <span>1</span>
        <span>2</span>
        <span>3</span>
    </div>
    <script>
        var box = document.getElementById('box');
        var childs = box.childNodes;

        console.log(childs.length);  //9
    </script>
</body>

用 childNodes 獲取到的是當前一層的所有子節點,包括文本和註釋節點。

每個節點有一個childNodes屬性,其中保存着一個NodeList對象,NodeList是一種類數組對象,用於保存一組有序的節點,可以通過爲止來訪問這些節點。請注意,雖然可以通過方括號[]的語法來訪問NodeList的值,而且這個對象也有length屬性,但它並不是Array的實例。NodeList對象的獨特之處在於,它實際上是基於DOM結構動態執行查詢的結果,因此DOM結構的變化能夠自動反應在NodeList對象中。我們常說,NodeList是由生命,有呼吸的的對象,而不是我們第一次訪問它們的某個瞬間拍攝下來的一張快照。

每個節點都有nodeName和nodeValue屬性,分別用來獲取節點的名字和節點的值,對於文檔節點和元素節點,獲取到的nodeValue永遠都是null,對於註釋節點文本節點獲取到的就是它們本身。

一張圖看懂各個節點之間的關係:

1.jpg-31.6kB

操作元素節點

  • 創建元素節點

    • document.createElement(tag)
  • 創建文本節點

    • document.createTextNode(text)
  • 全部都是 父級.方法 剪切操作 返回添加的節點 剪切後的事件依然存在

    • appendChild(node) 向父節點最後添加節點
    • insertBefore(new,old) 向某個元素前面添加節點,如果第二個參數是null那麼它的功能就是appendChild。
    • replaceChild(new,old) 替換節點
    • removeChild(node) 刪除節點
  • 克隆節點
    • cloneNode(boolean)不寫參數默認false只克隆當前節點,寫true的話會進行深度複製。但是不會複製事件。

操作文本節點

  • 全部都是 文本節點.方法 返回添加的節點
    • appendData(text) 將text添加到節點的末尾
    • 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 的是無法獲取和設置的,對應設置節點屬性,如果使用大寫的字符,會自動轉換成小寫。

  • ele.style獲取的是style對象,getAttribute(‘style’) 獲取到的是後面的字符串。
  • ele.src 獲取絕對路徑 getAttribute(‘src’) 獲取到的src後面的字符串

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

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

獲取元素節點

  • node.children 獲取節點下的所有元素節點
  • node.firstElementChild 獲取節點下的第一個元素節點
  • node.lastElementChild 獲取節點下的最後一個元素節點
  • node.previousElementSibling 獲取元素的上一個兄弟節點
  • node.nextElementSibling 獲取元素的下一個兄弟節點

兩個動態獲取元素的方法:

  • document||content.getElementsByTagName(tag)
  • document||content.getElementsByClassName(class1 class2 …)

classList 對象

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

  • 在這個對象下有4個方法
    • add(class) 將指定的字符串添加到class列表中
    • contains(class) 判斷列表中是否有某個class
    • remove(class) 移除某個class
    • toggle(class) 如果列表中已經存在就刪除返回false,否則添加返回true

對錶格的操作

以獲取表格中的第一個單元格爲例:
<table id="table">
    <tr>
        <td></td>
        <td></td>
        <td></td>
    </tr>
    <tr>
        <td></td>
        <td></td>
        <td></td>
    </tr>
</table>
<script>
    var tab = document.getElementById('table');
    tab.tBodies[0].rows[0].cells[0]
</script>
對錶格的 增 刪 改 查
  • 以下全部爲 #tableElement.方法
    • createTHead() 創建thead元素,並自動插入
    • createTFoot() 創建tfoot元素,並自動插入
    • createCaption() 創建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

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>offsetWidth、clientWidth、width、scrollWidth區別及js與jQuery獲取的方式</title>
<script type="text/javascript" src="jquery.min.js"></script>

</head>
<body style="border:1px solid #ccc">
        <div id="div" style="width:100px;height:80px;left:10px;top:8px;position:relative;border:1px solid #ccc;margin:20px 10px;padding:7px 6px;">
        </div>

    <script type="text/javascript">
        var divObj = document.getElementById("div");

        var dOffsetWidth = divObj.offsetWidth;//返回元素的寬度(包括元素寬度、內邊距和邊框,不包括外邊距)
        var $dOffsetWidth = $(divObj).outerWidth(false);//參數爲true,包括外邊距

        var dOffsetHeight = divObj.offsetHeight;//返回元素的高度(包括元素高度、內邊距和邊框,不包括外邊距)
        var $dOffsetHeight = $(divObj).outerHeight(false);//參數爲true,包括外邊距


        var dClientWidth = divObj.clientWidth;//返回元素的寬度(包括元素寬度、內邊距,不包括邊框和外邊距)
        var $dClientWidth = $(divObj).innerWidth();

        var dClientHeight = divObj.clientHeight;//返回元素的高度(包括元素高度、內邊距,不包括邊框和外邊距)
        var $dClientHeight = $(divObj).innerHeight();

        var dWidth = divObj.style.width;//返回元素的寬度(包括元素寬度,不包括內邊距、邊框和外邊距)
        var $dWidth = $(divObj).width();//width(val)設置寬

        var dHeight = divObj.style.height;//返回元素的高度(包括元素高度,不包括內邊距、邊框和外邊距)
        var $dHeight = $(divObj).height();//height(val)設置高

        var dscrollWidth = divObj.scrollWidth;//返回元素的寬度(包括元素寬度、內邊距和溢出尺寸,不包括邊框和外邊距),無溢出的情況,與clientWidth相同
        var dscrollHeight = divObj.scrollHeight;//返回元素的高度(包括元素高度、內邊距和溢出尺寸,不包括邊框和外邊距),無溢出的情況,與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)的區別
    1. style.height 返回的是字符串,如28px,offsetWidth返回的是數值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則仍能取到。
*/

/*
    總結:
    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()獲取不包含邊框、不包含外邊距的寬度
*/
    </script>
</body>
</html>
發佈了44 篇原創文章 · 獲贊 4 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章