1.節點的概念
2.節點的屬性(nodeType,nodeName,nodeValue)
3.父節點(父元素)
4.獲取子節點或子元素
5.獲取節點、元素的方法(12行代碼)
6.案例:div標簽里面的p標簽背景高亮(使用子節點或子元素的方式)
7.封裝節點兼容代碼
8.案例:切換背景圖片
9.案例:全選、全不選
10.元素創建的第一種方式 document.write("<p>文本</P>");
11.元素創建的第二種方式 document.getElementById("divId").innerHTML="<p>新添加的文本</P>";
12.案例:點擊按鈕,在div中加載一張圖片
13.案例:動態創建列表(元素創建的第二種方式)
14.第三種元素創建方式 var pEle = document.createElement("p");
15.案例:動態創建列表(使用第三種元素創建方式)
16.動態創建表格(使用第三種元素創建方式)
17.【操作元素的一些方法】
18.點擊按鈕,創建元素(只創建一次)
19.為元素綁定多個事件
20.為元素綁定事件的兼容代碼
21.解綁事件的三種方式
22.解綁事件的兼容代碼
23.事件冒泡、阻止事件冒泡
24.事件的3個階段
25.為同一個元素綁定多個不同事件,事件使用同一個處理函數
26.案例:模擬百度搜索
1.節點的概念 <--返回目錄
* 文檔:document
* 元素:element,頁面中所有的標簽都是元素,標簽--元素--對象
* 節點:node,頁面中所有的內容(標簽、屬性、文本)
* 根元素:html這個標簽
2.節點的屬性(nodeType,nodeName,nodeValue) <--返回目錄
* 節點的屬性:可以通過標簽(屬性或文本).點出來
* 節點類型nodeType:1--標簽,2--屬性,3--文本
* 節點名稱nodeName:標簽節點--大寫的標簽名字,屬性節點--小寫的屬性名字,文本節點--#text
* 節點的值nodeValue:標簽節點--null,屬性節點--屬性值,文本節點--文本內容
3.父節點(父元素) <--返回目錄
* 只有標簽可以作為父節點(父元素)
- 獲取所有的父節點 ele.parentNode;
- 獲取所有的父元素 ele.parentElement;
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>標題</title> </head> <body> <div id="box"> div里面的文本 <p>p里面的文本</p> </div> <script type="text/javascript"> var pEle = document.getElementById("box").getElementsByTagName("p")[0]; console.log(pEle.parentNode);//[object HTMLDivElement]---說明父節點是標簽 console.log(pEle.parentElement);//[object HTMLDivElement]---說明父元素是標簽 var parentEle= pEle.parentNode; //獲取父標簽 console.log(parentEle.nodeType); //1--標簽類型 console.log(parentEle.nodeName); //DIV--標簽名字 console.log(parentEle.nodeValue); //null--標簽的值 </script> </body> </html>
4.獲取子節點或子元素 <--返回目錄
* 獲取所有的子節點 ele.childNodes;
* 獲取所有的子元素(子標簽) ele.children;
【獲取子節點或子元素】
<div id="box"> div里面的文本 <p>p里面的文本</p> <a href=""></a> </div> <script type="text/javascript"> var divEle = document.getElementById("box"); console.log(divEle.childNodes);//子節點NodeList(5) [ #text, p, #text, a, #text ] console.log(divEle.children);//子元素HTMLCollection [ p, a ] </script>
代碼:【獲取子節點】
<div id="box"> div里面的文本 <p>p里面的文本</p> <a href="">a標簽里面的文本</a> </div> <script type="text/javascript"> var divEle = document.getElementById("box"); var _childNodes = divEle.childNodes;//子節點NodeList(5) [ #text, p, #text, a, #text ] for(var i=0;i<_childNodes.length;i++){ console.log(_childNodes[i].nodeType+"---"+_childNodes[i].nodeName+"---"+_childNodes[i].nodeValue); } </script>
結果:
3---#text---div里面的文本
1---P---null
3---#text---
1---A---null
3---#text---
【根據屬性名字獲取屬性節點】
<script type="text/javascript"> var ele = document.getElementById("txt"); var attNode = ele.getAttributeNode("name"); console.log(attNode);//屬性節點name="username" alert(attNode);//屬性節點[object Attr] console.log(attNode.nodeType+"---"+attNode.nodeName+"---"+attNode.nodeValue);//2---name---username </script>
5.獲取節點、元素的方法(12行代碼) <--返回目錄
* 總結:凡是獲取節點的代碼在谷歌和火狐得到的都是節點,凡是獲取元素的代碼在谷歌和火狐總都是元素;
除父(子)節點/元素,凡是獲取節點的代碼在IE8中得到的是元素,獲取元素的代碼不支持。
//父節點 ele.parentNode; //父元素 ele.parentElement; //子節點 ele.childNodes; //子元素 ele.children; //第一個子節點 ele.firstChild; //第一個子元素 ele.firstElementChild //最后一個子節點 ele.lastChild; //最后一個子元素 ele.lastElementChild; //某個元素的前一個兄弟節點 ele.previousSibling; //某個元素的前一個兄弟元素 ele.previousElementSibling; //某個元素的后一個兄弟節點 ele.nextSibling; //某個元素的后一個兄弟元素 ele.nextElementSibling;
6.案例:div標簽里面的p標簽背景高亮(使用子節點或子元素的方式) <--返回目錄
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>標題</title> </head> <body> <input type="button" value="變色"> <div style="width:300px;border:2px solid blue"> <span>這是span內的文本1</span> <p>這是p內的文本1</p> <span>這是span內的文本2</span> <p>這是p內的文本2</p> </div> <script type="text/javascript"> var divEle = document.getElementsByTagName("div")[0]; document.getElementsByTagName("input")[0].onclick=function(){ var eles = divEle.children;//獲取div標簽里面所有的子標簽 //遍歷所有的子標簽,並判斷是否是p標簽 for(var i=0;i<eles.length;i++){ if(eles[i].nodeType===1 && eles[i].nodeName==="P"){ eles[i].style.backgroundColor="red"; } } }; </script> </body> </html>
7.封裝節點兼容代碼 <--返回目錄
獲取任意一個父元素的第一個子元素
function getfirstEleChild(ele){ //if(typeof ele.firstElementChild != "undefined"){ if(ele.firstElementChild){ //ele.firstElementChild有值就為true return ele.firstElementChild; }else{ var node = ele.firstChild; while(node && node.nodeType !=1){ node=node.nextSibling; } return node; } }
獲取任意一個父元素的最后一個子元素
function getlastEleChild(ele){ if(ele.lastElementChild){ //ele.lastElementChild有值就為true return ele.lastElementChild; }else{ var node = ele.lastChild; while(node && node.nodeType !=1){ node=node.previousSibling; } return node; } }
8.案例:切換背景圖片 <--返回目錄
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>標題</title> <style type="text/css"> img{ width:150px; } div{ width: 700px; margin: 0 auto; } body { background:url("images/1.jpg");/*設置背景圖片*/ } </style> </head> <body> <div id="box"> <img src="images/1.jpg"> <img src="images/2.jpg"> <img src="images/3.jpg"> <img src="images/4.jpg"> </div> <script type="text/javascript"> var eles = document.getElementById("box").children; for(var i=0;i<eles.length;i++){ eles[i].onclick=function(){ console.log(this.src);//file:///C:/Users/oy/Desktop/images/2.jpg document.body.style.background="url("+this.src+")"; console.log("url("+this.src+")");//url(file:///C:/Users/oy/Desktop/images/2.jpg) }; } </script> </body> </html>
9.案例:全選、全不選 <--返回目錄
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>標題</title> </head> <body> <table align="center" width="30%" cellspacing="0" border="1" bgcolor="#eee"> <tr > <th><input type="checkbox" id="checkboxId"></th> <th>菜名</th> <th>飯店</th> </tr> <tbody> <tr align="center"> <td><input type="checkbox" name=""></td> <td>aa</td> <td>aa</td> </tr > <tr align="center"> <td><input type="checkbox" name=""></td> <td>aa</td> <td>aa</td> </tr> <tr align="center"> <td><input type="checkbox" name=""></td> <td>aa</td> <td>aa</td> </tr> </tbody> </table> <script type="text/javascript"> var checkboxEle = document.getElementById("checkboxId"); var eles = document.getElementsByTagName("input"); //為第一個checkbox注冊點擊事件 checkboxEle.onclick=function(){ //如果第一個checkbox選中,則全部選中; 否則,全部取消選中 for(var i=0;i<eles.length;i++){ eles[i].checked=this.checked; } }; //為后面3個checkbox注冊點擊事件 for(var j=1;j<eles.length;j++){ eles[j].onclick=function(){ //判斷后面3個checkbox的狀態,如果都被選中,則將第一個checkbox也選中 var count=0;//計數器,用於保存選中的checkbox的個數 for(var k=1;k<eles.length;k++){ if(eles[k].checked){ count++; } } //如果計數器count=3,說明后面3個checkbox都被選中了,則將第一個checkbox也選中 //如果計數器count<3,則將第一個checkbox去掉選中 console.log(`count = ${count}`) if(count == 3){ checkboxEle.checked=true; }else if(count<3){ checkboxEle.checked=false; } }; } </script> </body> </html>
10.元素創建的第一種方式 <--返回目錄
document.write("<p>文本</P>");
- 如果是頁面加載完畢后,通過該種方式創建元素,頁面之前的所有內容被清空
- 如果是頁面加載的時候,通過該種方式創建元素,頁面之前的所有內容被保留
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>標題</title> </head> <body> <input type="button" id="btn" value="按鈕" /> <script type="text/javascript"> var ele = document.getElementById("btn"); ele.onclick=function(){ document.write("<p>文本</P>");//該句代碼是在點擊按鈕后執行,此時頁面已經加載完畢,頁面之前的所有內容被清空 }; document.write("<p>文本</P>");//頁面加載的時候,通過該種方式創建元素,頁面之前的所有內容被保留 </script> </body> </html>
11.元素創建的第二種方式 <--返回目錄
document.getElementById("divId").innerHTML="<p>新添加的文本</P>";
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>標題</title> </head> <body> <input type="button" id="btn" value="按鈕" /> <div id="divId" style="width: 300px;height: 200px;border:2px solid pink">div原來的文本</div> <script type="text/javascript"> var ele = document.getElementById("btn"); ele.onclick=function(){ document.getElementById("divId").innerHTML="<p>新添加的文本</P>";//將原來的文本覆蓋了 }; </script> </body> </html>
12.案例:點擊按鈕,在div中加載一張圖片 <--返回目錄
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>標題</title> <style type="text/css"> img{ width: 300px; height:300px; } </style> </head> <body> <input type="button" id="btn" value="按鈕" /> <div id="divId" style="width:300px; height:300px; border:2px solid pink">div原來的文本</div> <script type="text/javascript"> var ele = document.getElementById("btn"); ele.onclick=function(){ //點擊按鈕,在div中加載一張圖片,加載的圖片也會應用已經定義的樣式 document.getElementById("divId").innerHTML="<img src='a.jpg'/>"; }; </script> </body> </html>
13.案例:動態創建列表(元素創建的第二種方式) <--返回目錄
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>標題</title> <style type="text/css"> *{ padding: 0; margin: 0; } </style> </head> <body> <input type="button" id="btn" value="按鈕" /> <div id="divId" style="width: 300px;height: 300px;border:2px solid pink">div原來的文本</div> <script type="text/javascript"> var names = ["西施","楊玉環","貂蟬","王昭君"]; var ele = document.getElementById("btn"); ele.onclick=function(){ var str = "<ul style='list-style-type:none;cursor:pointer'>"; for(var i=0;i<names.length;i++){ str += "<li>"+names[i]+"</li>"; } str += "</ul>"; document.getElementById("divId").innerHTML=str; }; </script> </body> </html>
14.第三種元素創建方式 <--返回目錄
var pEle = document.createElement("p");
<input type="button" id="btn" value="按鈕" /> <div id="divId" style="width: 300px;height: 300px;border:2px solid pink">div原來的文本</div> <script type="text/javascript"> document.getElementById("btn").onclick=function(){ var pEle = document.createElement("p"); pEle.innerText="這是p標簽里面的文本"; document.getElementById("divId").appendChild(pEle);//在后面追加 }; </script>
15.案例:動態創建列表(使用第三種元素創建方式) <--返回目錄
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>標題</title> <style type="text/css"> *{ padding: 0; margin: 0; } </style> </head> <body> <input type="button" id="btn" value="按鈕" /> <div id="divId" style="width: 300px;height: 300px;border:2px solid pink">div原來的文本</div> <script type="text/javascript"> var names = ["a","b","c"]; document.getElementById("btn").onclick=function(){ var parent = document.getElementById("divId"); var ulNode = document.createElement("ul"); parent.appendChild(ulNode); for(var i=0;i<names.length;i++){ var node = document.createElement("li"); node.innerText=names[i]; ulNode.appendChild(node); node.onmouseover = mouseoverHandler; node.onmouseout = mouseoutHandler; } }; var mouseoverHandler = function (){ this.style.backgroundColor = "#ccc"; }; var mouseoutHandler = function (){ this.style.backgroundColor = ""; }; </script> </body> </html>
16.動態創建表格(使用第三種元素創建方式) <--返回目錄
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>標題</title> </head> <body> <input type="button" id="btn" value="按鈕" /> <div id="divId" style="width: 300px;height: 300px;border:2px solid pink">div原來的文本</div> <script type="text/javascript"> var names = [ {"name":"百度","href":"http://www.baidu.com"}, {"name":"谷歌","href":"http://www.google.com"}, ]; document.getElementById("btn").onclick=function(){ //創建table元素,並添加到div元素下 var parent = document.getElementById("divId"); var table = document.createElement("table"); table.border = "1"; parent.appendChild(table); for(var i=0;i<names.length;i++){ var node = names[i]; //創建tr元素,並添加到table元素下 var tr = document.createElement("tr"); table.appendChild(tr); //創建第一列,並添加到tr下 var td = document.createElement("td"); td.innerText = node.name; tr.appendChild(td); //創建第二列,並添加到tr下 var td = document.createElement("td"); td.innerHTML = "<a href="+node.href+">"+node.name+"</a>"; tr.appendChild(td); } }; </script> </body> </html>
17.操作元素的一些方法 <--返回目錄
* parentEle.appendChild(node);//追加子元素
* parentEle.insertBefore(newChild,refChild);//在指定的元素refEle之前插入newEle
parentEle.insertBefore(newChild,parentEle.firstElementChild);//在div里面最前面插入newEle
* parentEle.replaceChild(newChild,refChild);//替換
* parentEle.removeChild(parentEle.firstElementChild);//刪除第一個子元素
* 刪除所有子元素
while(parentEle.firstElementChild){
parentEle.removeChild(parentEle.firstElementChild);//刪除第一個子元素
}
18.點擊按鈕,創建元素(只創建一次) <--返回目錄
* 有則刪除,無則創建,即創建之前先判斷是否存在,存在刪除,然后創建
* 或者,創建之前先判斷是否存在,存在就什么也不做,不存在就創建。
19.為元素綁定多個事件 <--返回目錄
* ele.addEventListener(type,listener,useCapture);//可以為同一個元素綁定多個相同的事件,谷歌火狐都支持,IE8不支持
- 參數一:{string}type 事件的類型,沒有on前綴
- 參數二:{Function}listener 事件處理函數
- 參數三:{boolean}useCapture 目前就寫false,不解釋
* ele.attachEvent("onclick",fn);谷歌火狐不支持,IE8支持
* 區別
addEventListener 谷歌、火狐、IE11支持,IE8不支持
attachEvent 谷歌、火狐不支持,IE11不支持,IE8支持
ele.addEventListener("click", function(){ console.log(this); // this為ele這個對象 }, false); ele.attachEvent("onclick", function(){ console.log(this); // this為window這個對象 });
20.為元素綁定事件的兼容代碼 <--返回目錄
為任意元素,綁定任意的事件,事件處理函數
function addEventListener(ele,type,fn){ //判斷瀏覽器是否支持這個方法 if(ele.addEventListener){ ele.addEventListener(type,fn,false); }else if(ele.attachEvent){ ele.attachEvent("on"+type,fn); }else{ ele["on"+type]=fn; } }
21.解綁事件的三種方式 <--返回目錄
第一種:ele.onclick=null;
注意:用什么方式綁定事件,就應該用對應的方式解綁事件
<input type="button" id="btn" value="按鈕" /> <input type="button" id="btn2" value="解綁事件" /> <script type="text/javascript"> document.getElementById("btn").onclick=function(){ alert(1); }; document.getElementById("btn2").onclick=function(){ document.getElementById("btn").onclick=null; }; </script>
第二種:ele.removeEventListener("click",命名函數的名字,false);
IE8不支持addEventListener和removeEventListener
<input type="button" id="btn" value="按鈕" /> <input type="button" id="btn2" value="解綁事件" /> <script type="text/javascript"> var ele = document.getElementById("btn"); ele.addEventListener("click",f1,false); ele.addEventListener("click",f2,false); //移除第二個綁定事件 document.getElementById("btn2").onclick=function(){ ele.removeEventListener("click",f1,false); }; function f1(){ console.log(1); } function f2(){ console.log(2); } </script>
第三種:
谷歌、火狐不支持,IE8支持
<input type="button" id="btn" value="按鈕" /> <input type="button" id="btn2" value="解綁事件" /> <script type="text/javascript"> var ele = document.getElementById("btn"); ele.attachEvent("onclick",f1,false); ele.attachEvent("onclick",f2,false); //移除第二個綁定事件 document.getElementById("btn2").onclick=function(){ ele.detachEvent("onclick",f1); }; function f1(){ console.log(1); } function f2(){ console.log(2); } </script>
22.解綁事件的兼容代碼 <--返回目錄
//為任意的一個元素解綁任意事件、任意響應函數 function removeEventListener(ele,type,fnName){ if(ele.removeEventListener){ ele.removeEventListener(type,fnName,false); }else if(ele.detachEvent){ ele.detachEvent("on"+type,fnName); }else{ ele["on"+type]=null; } }
注意:以后,一般都使用兼容代碼,不使用ele.onclick=null;為了以防多個人給同一個元素綁定了相同的事件
23.事件冒泡、阻止事件冒泡 <--返回目錄
* 事件冒泡:多個元素嵌套,這些元素都綁定了相同的事件,如果里面的元素的事件觸發了,外面的元素的事件也自動觸發。
* 阻止事件冒泡:
- window.event.cancelBubble = true; // IE特有的,谷歌支持,火狐不支持
- e.stopPropagation(); // 谷歌火狐支持,IE不支持
24.事件的3個階段 <--返回目錄
* 事件捕獲階段:從外向里
* 事件目標階段
* 事件冒泡階段:從里向外
* addEventListener(,,false|true)
- false:從目標階段開始,從里向外冒泡
- true:從外到里開始捕獲,直到目標階段【直到捕獲事件的觸發目標】
- 一般默認使用false,很少用true
25.為同一個元素綁定多個不同事件,事件使用同一個處理函數 <--返回目錄
<input type="button" id="btn" value="按鈕" /> <script type="text/javascript"> var ele = document.getElementById("btn"); ele.onclick = fun; ele.onmouseover = fun; ele.onmouseout = fun; function fun(e){ switch(e.type){ case "click": console.log("鼠標點擊事件"); break; case "mouseover": console.log("鼠標進入事件"); break; case "mouseout": console.log("鼠標離開事件"); break; } } </script>
26.案例:模擬百度搜索 <--返回目錄
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>標題</title> <style type="text/css"> *{ margin: 0; padding: 0; } ul{ list-style-type: none; } </style> </head> <body> <div> <input type="text" id="txt" style="width: 200px;"/> <input type="button" id="btn" value="搜索"/> <div id="divId" style="width: 200px;display: none;border: 1px solid #ccc"></div> </div> <script type="text/javascript"> var keywords = ["我愛你","我喜歡你","我不喜歡你"]; var txtEle = document.getElementById("txt"); txtEle.onkeyup = function() { //獲取文本框輸入的內容 var text = this.value; var tempArr = [];//用於存放匹配上的數據 //把文本框輸入的內容與數組中的數據進行對比,匹配上的數據添加到tempArr中 for(var i=0;i<keywords.length;i++){ console.log(text.length); if(text.length>0 && keywords[i].indexOf(text)==0){ tempArr.push(keywords[i]);//追加 } } console.log(tempArr); var div = document.getElementById("divId"); //如果tempArr中有數據,創建列表 if(tempArr.length>0){ //先清空div中內容 while(div.firstElementChild){ div.removeChild(div.firstElementChild);//刪除第一個子元素 } var ul = document.createElement("ul"); div.appendChild(ul); //根據tempArr的數據創建列表,添加到div中 for(var j=0;j<tempArr.length;j++){ var li = document.createElement("li"); li.innerText = tempArr[j]; ul.appendChild(li); //為li標簽添加鼠標進入和移出事件 li.onmouseover = function(){ this.style.backgroundColor = "#888"; }; li.onmouseout = function(){ this.style.backgroundColor = ""; }; //為li標簽添加鼠標點擊事件 li.onclick = function(){ //將li標簽內的文本添加到輸入框中 txtEle.value = this.innerText; //將div隱藏 div.style.display = "none"; }; } //使得div顯示 div.style.display = "block"; }else{ div.style.display = "none"; } } </script> </body> </html>
---