文檔對象模型(Document Object Model,DOM)是一種用於HTML和XML文檔的編程接口。它給文檔提供了一種結構化的表示方法,能夠改變文檔的內容和呈現方式。咱們最爲關心的是,DOM把網頁和腳本以及其餘的編程語言聯繫了起來。DOM屬於瀏覽器,而不是JavaScript語言規範裏的規定的核心內容。javascript
1、查找元素html
一、直接查找java
document.getElementById 根據ID獲取一個標籤
document.getElementsByName 根據name屬性獲取標籤集合
document.getElementsByClassName 根據class屬性獲取標籤集合
document.getElementsByTagName 根據標籤名獲取標籤集合
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <html> <div id="i1"></div> <div name="n1"></div> <div class="c1"></div> </html> <script> d1 = document.getElementById("i1") //返回單個元素,由於id不能重複 d2 = document.getElementsByName('n1') //返回數組 d3 = document.getElementsByClassName('c1') //返回數組 d4 = document.getElementsByTagName('div') //返回數組 </script> </body> </html>
二、間接查找node
填充顏色的 Node是可帶文本信息的,能夠經過 d1.noteType的值來判斷是文本仍是標籤,值爲1爲標籤,3表示文本編程
parentNode // 父節點 childNodes // 全部子節點 firstChild // 第一個子節點 lastChild // 最後一個子節點 nextSibling // 下一個兄弟節點 previousSibling // 上一個兄弟節點
parentElement // 父節點標籤元素
children // 全部子標籤
firstElementChild // 第一個子標籤元素
lastElementChild // 最後一個子標籤元素
nextElementtSibling // 下一個兄弟標籤元素
previousElementSibling // 上一個兄弟標籤元素
2、操做數組
一、內容瀏覽器
innerText 文本
outerText
innerHTML HTML內容
innerHTML
value 值
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <html> <a href="https://www.baidu.com"> 百度<span>66666</span> </a> </html> <script> var obj = document.getElementsByTagName('a')[0] alert(obj.innerText) //百度66666 alert(obj.innerHTML) //<span>66666</span> </script> </body> </html>
value通常來取表單中的標籤的值,或者給表單中的標籤賦值app
<input type="text">
<input type="password">
<textarea>123</textarea>
以上三種標籤都是能夠經過vaue來取值和賦值的,直接改變文本框中的內容
<input type="checkbox" value="籃球">
<input type="radio" value="是否"> 多個radio,name相同時是互斥的
以上value表示選中的值是什麼,可是經過checked=true來選中的
<select><option value='01'>北京</option></select>
上面的value是當前選中的是哪一個北京-->01,能夠經過script代碼,找到select對象,obj.value = '01'來選中
select是經過標籤屬性selected = selected來默認選擇的
在script代碼中,找到select對象,設置obj.selectIndex = 0 ,則選中第一個
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <html> <input id="i1" type="text"> <select id="se1"> <option value="bj">北京</option> <option value="sh">上海</option> </select> </html> <script> var obj1 = document.getElementById('i1') var v1 = obj1.value //當期text文本中的值 obj1.value = "你好" //給文本框賦值爲:你好 var obj2 = document.getElementById('se1') obj2.value = "sh" //將選擇框的默認值選擇爲:sh </script> </body> </html>
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <div> <input type="button" value="全選" onclick="CheckAll();"> <input type="button" value="取消" onclick="CancelAll();"> <input type="button" value="反選" onclick="Reverse();"> </div> <table> <thead> <th>選擇</th> <th>姓名</th> <th>年齡</th> </thead> <tbody> <tr> <td ><input class="c" type="checkbox" value="1"></td> <td>張三</td> <td>男</td> </tr> <tr> <td ><input class="c" type="checkbox" value="1"></td> <td>李四</td> <td>男</td> </tr> <tr > <td ><input class="c" type="checkbox" value="1"></td> <td>王五</td> <td>女</td> </tr> <tr> <td ><input class="c" type="checkbox" value="1"></td> <td>張三</td> <td>男</td> </tr> </tbody> </table> <script> function CheckAll() { che = document.getElementsByClassName('c') for(var i=0;i<che.length;i++){ che[i].checked = true } } function CancelAll() { che = document.getElementsByClassName('c') for(var i=0;i<che.length;i++){ che[i].checked = false } } function Reverse() { che = document.getElementsByClassName('c') for(var i=0;i<che.length;i++){ var isChe = che[i].checked if(isChe){ che[i].checked = false } else{ che[i].checked = true } } } </script> </body> </html>
二、屬性dom
attributes // 獲取全部標籤屬性 setAttribute(key,value) // 設置標籤屬性 getAttribute(key) // 獲取指定標籤屬性
removeAttribute() //刪除屬性
/* var atr = document.createAttribute("class"); atr.nodeValue="democlass"; document.getElementById('n1').setAttributeNode(atr); */
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <input type="button" value="點擊改變" onclick="Click();"> <div class="c">111</div> <div class="c" defContent="1">111</div> <div class="c">111</div> <div class="c" defContent="1">111</div> <div class="c">111</div> <div class="c" defContent="1">111</div> <div class="c">111</div> <script> function Click() { var get_obj = document.getElementsByTagName('div') for(var i=0;i<get_obj.length;i++){ if(get_obj[i].getAttribute("defContent")=="1"){ console.log(get_obj[i].innerText) get_obj[i].innerText = 888 } } } </script> </body> </html>
三、class操做編程語言
obj.className //obj表示元素對象,獲取全部樣式名稱,返回字符串 li = obj.classList //獲取全部樣式,而且返回列表 li.add('className1') //添加class='className1'的樣式 li.remove('className1') //刪除class='className1'的樣式
例子:模態對話框
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <style> .hide{ display: none; } .i2{ position: fixed; top:0; right:0; bottom:0; left:0; background-color: rgba(0,0,0,0.6); } .i3{ position: fixed; top:50%; left:50%; width:400px; height:300px; background-color: white; margin-top:-150px; margin-left:-200px; } </style> </head> <body> <html> <div> <p><input type="button" value="點我彈出模態對話框" onclick="Hide();"></p> </div> <div id="i2" class="i2 hide"> </div> <div id="i3" class="i3 hide"> <p>用戶名:<input type="text"></p> <p>密碼:<input type="password"></p> <p><input type="button" value="肯定"> <input type="button" value="取消" onclick="Show();"></p> </div> </html> <script> function Hide() { document.getElementById('i2').classList.remove('hide') document.getElementById('i3').classList.remove('hide') } function Show() { document.getElementById('i2').classList.add('hide') document.getElementById('i3').classList.add('hide') } </script> </body> </html>
dom之特殊this,是將this參數所在的標籤做爲參數,傳給script函數的參數
<body>
<div id="i1" onclick="Func(this)">點我試試</div>
<script>
function Func(arg) {
console.log(arg.innerText) //輸出點我試試
}
</script>
</body>
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <style> .hide{ display: none; } .menu{ border:2px solid darkslategray; background-color: #c0cddf; width:200px; height: 800px; } .head{ background-color: brown; } .content ul{ margin:0; padding:2px; } </style> </head> <body> <div class="menu"> <div class="item"> <div class="head" onclick="Hide(this)">菜單1</div> <div class="content hide"> <ul> <li>內容1</li> <li>內容1</li> <li>內容1</li> <li>內容1</li> <li>內容1</li> </ul> </div> </div> <div class="item"> <div class="head" onclick="Hide(this)">菜單2</div> <div class="content hide"> <ul> <li>內容1</li> <li>內容1</li> <li>內容1</li> <li>內容1</li> <li>內容1</li> </ul> </div> </div> <div class="item"> <div class="head" onclick="Hide(this)">菜單3</div> <div class="content hide"> <ul> <li>內容1</li> <li>內容1</li> <li>內容1</li> <li>內容1</li> <li>內容1</li> </ul> </div> </div> <div class="item"> <div class="head" onclick="Hide(this)">菜單4</div> <div class="content hide"> <ul> <li>內容1</li> <li>內容1</li> <li>內容1</li> <li>內容1</li> <li>內容1</li> </ul> </div> </div> </div> <script> function Hide(arg) { item_el = arg.parentElement menu_el = item_el.parentElement items_el = menu_el.children for (var i=0;i<items_el.length;i++){ li = items_el[i].lastElementChild.classList if(li.contains('hide')){ } else{ li.add('hide') } items_el[i].lastElementChild.classList.add('hide') } console.log(arg.nextSibling) } </script> </body> </html>
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <style> .b{ color: black; } .g{ color: gray; } </style> </head> <body> <form> <input type="text" placeholder="請輸入內容"> <input class="g" type="text" value="請輸入內容" onfocus="Focus(this);" onblur="Blur(this);"> <script> function Focus(th) { if (th.value == "請輸入內容") { th.value = "" th.className = "b" } } function Blur(th) { if (th.value.trim()=="") { th.value = "請輸入內容" } if (th.value.trim()=="請輸入內容"){ th.className="g" } } </script> </form> </body> </html>
下圖Tab菜單實現:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <style> /*用after將父類的div撐開*/ .clearer:after{ content: '1'; display: block; height: 0; visibility: hidden; clear: both; } .menu{ background-color:#EBEBED ; border: 1px solid #D4D4D3 ; width:700px; margin: auto; z-index: 1; } .menu ul{ margin: 0; padding: 0; z-index: 2; } .menu li{ list-style:none; float: left; padding: 5px 20px 5px 20px; border-right:1px solid #D4D4D3; cursor: pointer; } .con{ width:700px; min-height: 150px; /*最小150,超過150自動撐大*/ margin: auto; border:1px solid #D4D4D3 ; } .changeColor{ color: red; background-color:white; } .hide{ display: none; } </style> </head> <body> <div class="menu clearer"> <ul> <li target="a1" onclick="Swich(this);">價格趨勢</li> <li target="a2" onclick="Swich(this);">市場分析</li> <li target="a3" onclick="Swich(this);">其餘</li> </ul> </div> <div class="con"> <div con="a1">價格趨勢</div> <div con="a2">市場分析</div> <div con="a3">其餘</div> </div> <script> function Swich(ths) { //點擊按鈕後,顏色變爲紅色 lis = ths.parentElement.children //父級元素的全部子元素,實際就是操做元素的兄弟元素 for(var i = 0;i < lis.length; i++){ lis[i].classList.remove('changeColor') } ths.className='changeColor' //點擊按鈕後,顯示對應的內容其餘隱藏 div1 = document.getElementsByClassName('con')[0] divs = div1.children for(var j=0;j<divs.length;j++){ li_value = ths.getAttribute('target') //單擊的li標籤target的屬性值 for(var j=0;j<divs.length;j++) { if(divs[j].getAttribute('con')==li_value){ divs[j].classList.remove('hide') }else{ divs[j].classList.add('hide') } } } } </script> </body> </html>
效果如圖:
四、標籤操做
a.建立標籤
// 方式一 var tag = document.createElement('a') tag.innerText = "wupeiqi" tag.className = "c1" tag.href = "http://www.cnblogs.com/wupeiqi" // 方式二 var tag = "<a class='c1' href='http://www.cnblogs.com/wupeiqi'>wupeiqi</a>"
b.操做標籤
// 方式一 var str = "<input type='text' />"; xxx.insertAdjacentHTML("beforeEnd",str); xxx表示標籤對象,str表示添加的標籤字符串 xxx.insertAdjacentElement('afterBegin',document.createElement('p')) //注意:第一個參數只能是'beforeBegin'、 'afterBegin'、 'beforeEnd'、 'afterEnd'
語法:
oElement = object . insertAdjacentElement ( "sWhere" , oElement )
參數:
oElement : 必選項。對象(Element)。要插入到 object 鄰近的對象。
sWhere : 必選項。字符串(String)。beforeBegin | afterBegin | beforeEnd | afterEnd
beforeBegin : 將 oElement 插到 object 的開始標籤以前。
afterBegin : 將 oElement 插到 object 的開始標籤以後。可是在 object 的全部原有內容以前。
beforeEnd : 將 oElement 插到 object 的結束標籤以前。可是在 object 的全部原有內容以後。
afterEnd : 將 oElement 插到 object 的結束標籤以後
// 方式二 var tag = document.createElement('a') xxx.appendChild(tag) xxx.insertBefore(tag,xxx[1])
字符串的方式操做實例:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <div> <input id="t1" type="text"> <input type="button" value="單擊添加" onclick="AddData();"> </div> <div> <ul id="i1"> <li>11111</li> <li>22222</li> </ul> </div> <script> function AddData() { var ul_obj = document.getElementById('i1') var text_obj = document.getElementById('t1') s0 = "<li>" + text_obj.value + "</li>" ul_obj.insertAdjacentHTML('beforeEnd',s0) } </script> </body> </html>
對象的方式添加標籤實例:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <div> <input id="t1" type="text"> <input type="button" value="單擊添加" onclick="AddData();"> </div> <div> <ul id="i1"> <li>11111</li> <li>22222</li> </ul> </div> <script> function AddData() { var inp = document.getElementById('t1') var new_ul = document.getElementById('i1') var inp_value = inp.value var new_li = document.createElement('li') //建立li標籤 new_li.innerText = inp_value //爲li標籤添加內容 new_ul.appendChild(new_li) //將li標籤添加至ul標籤中 } </script> </body> </html>
標籤的移動和複製
<body> <h id="h">標題</h> <div id="diva"> <div id="diva1">div1</div> <div id="diva2">div2</div> </div> <script> //下面將原有的h1添加到diva中,實際是移動 // var h1 = document.getElementById('h') // var diva = document.getElementById('diva') // diva.appendChild(h1) //下面是複製一個新的h1並添加到diva中,實際是複製 var h1 = document.getElementById('h') var diva = document.getElementById('diva') var new_h1 = h1.cloneNode(true) //true表示即克隆標籤又克隆內容,若是不加true只是克隆標籤 diva.appendChild(new_h1) </script> </body>
五、樣式操做
var obj = document.getElementById('i1') obj.style.fontSize = "32px"; obj.style.backgroundColor = "red";
六、位置操做
總文檔高度 document.documentElement.offsetHeight 當前文檔佔屏幕高度 document.documentElement.clientHeight 自身高度 tag.offsetHeight 距離上級定位高度 tag.offsetTop 父定位標籤 tag.offsetParent 滾動高度 tag.scrollTop /* clientHeight -> 可見區域:height + padding clientTop -> border高度 offsetHeight -> 可見區域:height + padding + border offsetTop -> 上級定位標籤的高度(若是全部父級標籤沒有出現position:當前標籤距離文檔頂端的高度;
若是父級標籤出現positon:當前標籤距離position標籤的距離不含邊框) scrollHeight -> 全文高:height + padding scrollTop -> 滾動高度 特別的: document.documentElement代指文檔根節點
obj.offsetParent 是找到obj父級中有position的標籤,若是父級中都沒有position,則返回body標籤
實例:頁面跳轉到頂部,若是滾動大於固定像素則跳轉頂部隱藏不然顯示
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <style> .c1{ position: fixed; right:20px; bottom: 20px; height: 40px; width: 40px; background-color: #c0cddf; } .hide{ display: none; } </style> </head> <body onscroll="Hide();"> <div style="height: 2000px"></div> <div class="c1 hide" id="i1"> <!--當href爲#或javascript:void(0);時表示什麼都不作,建議使用javascript:void(0);, 由於#會加地址欄而且會跳轉一下--> <a href="javascript:void(0)" onclick="GoTop();">返回頂部</a> </div> <script> function GoTop() { console.log(1111) //document.body.scrollTop=0; //根據瀏覽器不一樣選擇不一樣的版本 document.body.scrollTop=0 document.documentElement.scrollTop=0; } function Hide() { var top =document.body.scrollTop+document.documentElement.scrollTop var div_obj = document.getElementById('i1') if(top >= 100){ div_obj.classList.remove('hide') }else{ div_obj.classList.add('hide') } } </script> </body> </html>
注意:滾輪高度+可見窗口高度(document.documentElement.clientHeight)=文檔內容高度
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <style> body{ margin: 0; } .pg-head{ height: 48px; background-color: black; } body{ background-color: #dddddd; } .body-left{ background-color: red; position: absolute; left:200px; width:200px; } .body-right{ background-color: green; position: absolute; left:405px; right:200px; } .chapte{ height: 400px; } .fixed{ position: fixed; top: 2px; } .pitchOn{ background-color: darkslateblue; color: white; } </style> </head> <body onscroll="Wheel()"> <div class="pg-head"></div> <div class="pg-body"> <div class="body-left" id="body-left"> <ul id="menu_ul"> <li>第1章</li> <li>第2章</li> <li>第3章</li> <li>第4章</li> </ul> </div> <div id="body-right" class="body-right"> <div class="chapte">第一章</div> <div class="chapte">第二章</div> <div class="chapte">第三章</div> <div class="chapte">第四章</div> </div> </div> <script> function Wheel() { var body_obj = document.body var top = document.body.scrollTop+document.documentElement.scrollTop; left_obj = document.getElementById('body-left') if(top > 48){ left_obj.classList.add('fixed') }else{ left_obj.classList.remove('fixed') } var body_right_obj = document.getElementById('body-right'); var body_rights = body_right_obj.children; var menu_ul_obj = document.getElementById('menu_ul'); var menu_lis_obj = menu_ul_obj.children; for(var i=0;i<body_rights.length;i++){ myScrollTop = body_rights[i].offsetTop + 48; if(top > myScrollTop) { for(var j=0;j<menu_lis_obj.length;j++){ menu_lis_obj[j].classList.remove('pitchOn'); } menu_lis_obj[i].classList.add('pitchOn'); } } } </script> </body> </html>
七、提交表單
document.geElementById('form').submit()
能夠賦予button或div提交功能
八、其餘操做
console.log 輸出框 alert 彈出框 confirm 確認框 // URL和刷新 location.href 獲取URL location.href = "url" 重定向 location.reload() 從新加載 // 定時器 setInterval 屢次定時器 clearInterval 清除屢次定時器 setTimeout 單次定時器 clearTimeout 清除單次定時器
s = setInterval(func,1000) //表示每1秒執行一次func函數
clearInterval(s) //取消定時器
s2 = setTimeout(func,5000) //表示5秒後執行一次func函數
clearTimeout(s2) //表示在5秒以內還沒執行func函數,取消定時器
做用域補充:
1) javascript中只存在函數做用域
2)綁定事件的兩種方法:
<body>
<input type="button" id="btn" onclick="Func();">
<script>
function Func() {} //第1種綁定方法
document.getElementById('btn').onclick=function () {} //第2中綁定方法
</script>
</body>
3)事件觸發都是先加載到內存進行綁定,當觸發事件時才執行,下面例子三個按鈕結果均返回 3
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <div id="btn"> <input type="button" value="按鈕1"> <input type="button" value="按鈕2"> <input type="button" value="按鈕3"> </div> <script> btns = document.getElementById('btn').children for(var i=0;i<btns.length;i++){ current_btn = btns[i] current_btn.onclick = function () { alert(i) } } </script> </body> </html>
3、事件
1)註冊事件的兩種方法
<body>
<input type="button" id="btn" onclick="Func();">
<script>
function Func() {} //第1種綁定方法
document.getElementById('btn').onclick=function () {} //第2中綁定方法
</script>
</body>
2)this事件綁定函數的參數
在函數中是指代觸發事件的標籤對象
3)event
<body>
<input type="text" onkeydown="KeyDown(event);">
<script>
function KeyDown(eve) {
console.log(eve.keyCode) //event接收event內容對象,而後用keyCode輸出按下鍵盤的ascii碼
}
</script>
</body>
應用場景:按住shif鍵勾選多個複選框,用判斷是否是按住shift鍵盤
設置一個全局變量,判斷是否按住了shift鍵盤,若是按照了給全局變量賦值爲true,不然賦值爲false
4)自定義事件和默認事件
a標籤和submit都有系統默認的事件
首先,若是默認事件和自定義事件並存時,先執行自定義事件
<body>
<a id="click" href="https://www.baidu.com" onclick="Func();">百度</a>
<script>
function Func() {
a_obj = document.getElementById('click')
alert('自定義事件已運行')
}
</script>
</body>
以上代碼首先彈出:自定義事件已運行,而後跳轉到百度頁面,說明先執行自定義事件
<body>
<a id="click" href="https://www.baidu.com" onclick="return Func();">百度</a>
<script>
function Func() {
a_obj = document.getElementById('click')
alert('自定義事件已運行')
return false
}
</script>
</body>
以上代碼在onclick的函數裏面加上return,而且在觸發的函數中加上 return false,當返回false時再也不執行其餘事件;
若是return true則繼續執行其餘事件
應用場景:
輸入用戶名,密碼後進行登陸,若是有一項填寫錯誤則submit按鈕不執行事件,不然直接調用submit