这两天重新认真学下DOM对象元素节点查询
写下随笔总结一下,应该没有多少要说的,该说的应该全在代码的注释里面
本人学习看的视频资料:https://www.bilibili.com/video/BV1YW411T7GX?p=91
个人觉得该视频是一个讲的很细,听起来算是易懂的视频,吃了第一遍瞎找视频的亏
第一遍学JS学的不知道怎么说,原理很多都有印象,但是不会用,原理虽有印象但很多不懂或没涉及
第二遍是看上面那个视频学的,只想说,超哥牛逼,讲的挺好,主要是白嫖真香
虽然只是视频说是简单入门,但不少人说这已经算是从入门到精通的级别
废话不多说,直接上源码
1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta charset="UTF-8"> 5 <title>DOM对象初步介绍</title> 6 7 </head> 8 <body> 9 <p id="pId">我是id为pID的p标签</p> 10 <button id="btn1">按钮</button> 11 <script> 12 /* 13 DOM:全称Document Object Model文档对象类型,JS中通过DOM来对HTML文档进行操作 14 文档:文档表示的就是整个HTML网页文档 15 对象:对象表示网页中的每一个部分转化为一个对象 16 模型:使用模型来表示对象之间的关系,这样方便获取对象 17 */ 18 19 /* 20 节点Node,是构成网页最基本的组成部分,网页中的每一个部分都可称为一个节点 21 如:html标签、属性、文本、注释、整个文档都是一个节点,虽然都是节点,但是实际上他们的具体类型是不同的 22 比如:标签被称为元素节点、属性被称为属性节点、文本被称为文本节点、文档被称为文档节点 23 节点的类型不同,属性和方法也不尽相同 24 */ 25 26 var pId = document.getElementById("pId"); // 获取p对象 27 pId.innerHTML = "我是被修改后的p标签"; // 修改p标签的文本 28 29 /* 30 事件,就是用户和浏览器之间的交互行为,如点击鼠标,移动鼠标,关闭窗口等 31 可以为事件对应属性设置一些JS代码,当事件被触发时,相关代码将会执行 32 如:可以为按钮的对应事件绑定处理函数的形式来响应事件,当事件被触发时,其对应函数将被调用 33 像这种单击事件绑定的函数,我们称之为单击响应函数 34 */ 35 var btn1 = document.getElementById("btn1"); 36 btn1.onclick = function(){ 37 alert("你点到我了~"); 38 } 39 40 /* 41 浏览器在加载一个页面时,是按照自上向下的顺序加载的,读取到一行就运行一行 42 如果将script标签写到页面的上边(即页面在html内的body里面,script在html的head里面) 43 在执行script标签里面的代码时,此时页面还没加载完毕,页面没有加载DOM对象,会导致无法获取html对象 44 解决办法: 45 1、将JS代码编写到页面下部,为了可以在页面加载完毕后再执行js代码,上面的写法用的就是这种方法 46 这种方法追求性能,当事件发生时再加载,事件不发生就不加载,减少运行时间 47 2、onload时间会在整个页面加载完成后才触发,为window绑定一个onload对象 48 该事件对应的响应函数会在页面加载完成之后执行,这样可以确保代码执行时多有DOM对象加载完毕 49 追求代码维护,易管理,实现方法如下: 50 window.onload = function(){ 51 var pId = document.getElementById("pId"); 52 pId.innerHTML = "我是被修改后的p标签"; 53 var btn1 = document.getElementById("btn1"); 54 btn1.onclick = function(){ 55 alert("你点到我了~"); 56 } 57 } 58 删去body标签里面的script标签包括标签所有内容 59 再在head标签里新建一个script标签,再将上面代码(50 ~ 57)复制到script标签里面即可 60 */ 61 </script> 62 </body> 63 </html>
1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta charset="UTF-8"> 5 <title>DOM对象查询</title> 6 </head> 7 <body> 8 <button id="btn01">按钮01</button> 9 <button id="btn02">按钮02</button> 10 <button id="btn03">按钮03</button> 11 <p id="pId1">北京</p> 12 <p id="pId2">上海</p> 13 <p id="pId3">广州</p> 14 <p id="pId4">成都</p> 15 <p id="pId5">重庆</p> 16 <ul> 17 <li name="weather" class="wt">北京:snow</li> 18 <li name="weather" class="wt">上海:sun</li> 19 <li name="weather" class="wt">广州:rain</li> 20 <li name="weather" class="wt">成都:clowd</li> 21 <li name="weather" class="wt">重庆:mist</li> 22 </ul> 23 <script> 24 /* 25 获取元素节点,通过document对象调用 26 getElementById():通过id属性获取一个元素节点对象 27 getElementsByTagName():通过标签名获取一组元素节点对象 28 getElementsByName():通过name属性获取一组元素节点对象 29 */ 30 31 // getElementById() 32 var btn01 = document.getElementById("btn01"); // 查找id为btn01的节点 33 btn01.onclick = function(){ // 为按钮设置单击事件的响应函数 34 var beiJing = document.getElementById("pId1"); // 查找id为pId的节点 35 alert(beiJing.innerHTML); // innerHTML,通过这个属性可以获取元素内部的html代码 36 }; 37 38 // getElementsByTagName() 39 var btn02 = document.getElementById("btn02"); 40 btn02.onclick = function(){ 41 // 查找所有p节点,getElementsByTagName()可以根据标签名获取一组元素节点对象 42 // 使用这个方法会返回一个类数组对象,所有查询到的元素都会封装到对象中,就算只找到一个元素节点也会返回数组 43 var pList = document.getElementsByTagName("p"); 44 console.log(pList); // HTMLCollection(5) [p#pId1, p#pId2, p#pId3, p#pId4, p#pId5, 45 // pId1: p#pId1, pId2: p#pId2, pId3: p#pId3, pId4: p#pId4, pId5: p#pId5] 46 console.log(pList.length); // 5 47 for(var i = 0; i < pList.length; i++){ 48 // alert(pList[i]); // 返回[object HTMLParagraphElement] 49 alert(pList[i].innerHTML); // 依次弹出弹窗:北京、上海、广州、成都、重庆 50 }; 51 }; 52 53 // getElementsByName() 54 var btn03 = document.getElementById("btn03"); 55 btn03.onclick = function(){ 56 // 查询所有name = weather的所有节点,返回一个类数组对象 57 // innerHTML用于获取元素内部的HTML代码,但是要注意的是,对于自结束标签,这个属性没有意义 58 // 如果需要直接使用元素节点的属性:直接使用元素.属性名,如:元素.id、元素.name、元素.value 59 // 注意:class属性不能采用这种方式,若想读取class属性时需要使用元素.className 60 var nameOfWeatherList = document.getElementsByName("weather"); 61 console.log(nameOfWeatherList); // NodeList(5) [li, li, li, li, li] 62 console.log(nameOfWeatherList[0].innerHTML); // 北京:snow 63 for(var i = 0; i < nameOfWeatherList.length; i++){ 64 alert(nameOfWeatherList[i].innerHTML); 65 } 66 alert(nameOfWeatherList[0].className); // wt 67 } 68 </script> 69 </body> 70 </html>
1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta charset="UTF-8"> 5 <title>DOM对象元素节点查询2</title> 6 <style type="text/css"> 7 #country{ 8 background-color: aquamarine; 9 } 10 #city{ 11 background-color: slateblue; 12 } 13 #language{ 14 background-color: darksalmon; 15 } 16 </style> 17 </head> 18 <body> 19 <table id="tableId" border="1"> 20 <tr id="country"> 21 <td>China</td> 22 <td>America</td> 23 <td>Russia</td> 24 <td>Japan</td> 25 <td>India</td> 26 </tr> 27 <tr id="city"> 28 <td>Beijing</td> 29 <td>new York</td> 30 <td>Moscow</td> 31 <td>Tokyo</td> 32 <td>New Delhi</td> 33 </tr> 34 <tr id="language"> 35 <td>Chinese</td> 36 <td>English</td> 37 <td>Russian</td> 38 <td>Japanese</td> 39 <td>English</td> 40 </tr> 41 </table> 42 <button id="btn01">按钮01</button> 43 <button id="btn02">按钮02</button> 44 <button id="btn03">按钮03</button> 45 <script> 46 // 通过具体的元素节点调用 47 // getElementTagName() 方法,返回当前节点的指定标签名后代节点 48 var btn01 = document.getElementById("btn01"); 49 btn01.onclick = function(){ 50 var country = document.getElementById("country"); // 获取id为country的节点 51 var countryList = country.getElementsByTagName("td"); //返回country节点下标签名为td的所有后代节点的类数组对象 52 console.log(countryList); // HTMLCollection(5) [td, td, td, td, td] 53 console.log(countryList.length); // 5 54 for(var i = 0; i < countryList.length; i++){ 55 alert(countryList[i].innerHTML); 56 } // 遍历countryList类数组中的所有元素,即遍历country节点下标签名为td的所有后代节点的文本内容 57 }; 58 59 // childNodes 属性,表示当前节点的所有子节点 60 var btn02 = document.getElementById("btn02"); 61 btn02.onclick = function(){ 62 var language = document.getElementById("language"); 63 var languageChildNodes = language.childNodes; 64 console.log(languageChildNodes); // NodeList(11) [text, td, text, td, text, td, text, td, text, td, text] 65 console.log(languageChildNodes.length); // 11 66 for(var i = 0; i < languageChildNodes.length; i++){ 67 alert(languageChildNodes[i].innerHTML); // 依次出现undefined、Chinese、undefined、English、undefined、Russian、 68 // undefined、Japanese、undefined、English、undefined的弹窗 69 } 70 // childNodes属性会获取包括文本节点在内的所有节点 71 // 根据DOM标签标签间的空白也会被当成文本节点(除了IE8及以下的浏览器不会) 72 // IE8及以下浏览器返回4个子节点,其他类似Chrome、Firefox、IE9都返回9个元素节点 73 // 解决方法:将34 ~ 40行代码写成一行,标签之间不要有空白,即: 74 // <tr id="language"><td>Chinese</td><td>English</td><td>Russian</td><td>Japanese</td><td>English</td></tr> 75 } 76 // firstChild 属性,表示当前节点的第一个子节点 77 var btn03 = document.getElementById("btn03"); 78 btn03.onclick = function(){ 79 var city = document.getElementById("city"); 80 var cityFirstChildNode = city.firstChild; 81 console.log(cityFirstChildNode); // #text空白文本节点 82 // firstElementChild获取当前元素的第一个子元素,不支持IE8以下浏览器 83 var cityFirstElementChild = city.firstElementChild; 84 alert(cityFirstElementChild.innerHTML); // Beijing 85 } 86 // lastChild 属性,表示当前节点的最后一个子节点 87 // 与firstChild同理 88 </script> 89 </body> 90 </html>
1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta charset="UTF-8"> 5 <title>DOM对象元素节点查询3</title> 6 </head> 7 <body> 8 <table id="tableId" border="1"> 9 <tr id="country"> 10 <td id="China">China</td> 11 <td>America</td> 12 <td>Russia</td> 13 <td>Japan</td> 14 <td>India</td> 15 </tr> 16 <tr id="city"><td>Beijing</td><td>new York</td><td>Moscow</td><td>Tokyo</td><td>New Delhi</td></tr> 17 <tr id="language"> 18 <td>Chinese</td> 19 <td>English</td> 20 <td>Russian</td> 21 <td>Japanese</td> 22 <td>English</td> 23 </tr> 24 </table> 25 <br> 26 <button id="btn01">按钮01</button> 27 <button id="btn02">按钮02</button> 28 <button id="btn03">按钮03</button> 29 <button id="btn04">按钮04</button> 30 <button id="btn05">按钮05</button> 31 <input type="text" id="inputId"> 32 33 <script> 34 // 继续上一次的html代码,上次写的script很多写法是相同的, 35 // 为此我们可以定义一个函数,专门用来为指定元素绑定单击响应函数 36 // btnNumStr是按钮的id,fun是回调函数 37 function btnclick(btnNumStr,fun){ 38 var btn = document.getElementById(btnNumStr); 39 btn.onclick = fun; 40 } 41 42 // 父节点:parentNode 43 btnclick("btn01",function(){ 44 var ChinaTd = document.getElementById("China"); 45 var ChinaParentNode = ChinaTd.parentNode; // 返回id为China的父节点 46 // innerText 可以获取元素内部的文本内容,和innerHTML类似,会自动将标签去除,只留文本 47 console.log(ChinaParentNode.innerText); // China America Russia Japan India 48 }); 49 50 // 兄弟节点:previousSibling 返回上一个兄弟节点;nextSibling 返回下一个兄弟节点 51 btnclick("btn02",function(){ 52 var cityTr = document.getElementById("city"); 53 var cityPreviousSibling = cityTr.previousSibling; 54 console.log(cityPreviousSibling.innerText); // 获取到空白文本,undefined 55 // previousElemnetSibling 获取上一个兄弟元素,IE8及以下不支持 56 var cityPreviousElemnetSibling = cityTr.previousElementSibling; 57 alert(cityPreviousElemnetSibling); // [object HTMLTableRowElement] 58 alert(cityPreviousElemnetSibling.innerHTML); // <td id="China">China</td> 59 // <td>America</td> 60 // <td>Russia</td> 61 // <td>Japan</td> 62 // <td>India</td> 63 }); 64 btnclick("btn03",function(){ 65 var cityTr = document.getElementById("city"); 66 var cityNextSibling = cityTr.nextSibling; 67 console.log(cityNextSibling.innerText); // 获取到空白文本,undefined 68 // nextElemnetSibling 获取下一个兄弟元素,IE8及以下不支持 69 var cityNextElemnetSibling = cityTr.nextElementSibling; 70 alert(cityNextElemnetSibling); // [object HTMLTableRowElement] 71 alert(cityNextElemnetSibling.innerHTML); // <td>Chinese</td> 72 // <td>English</td> 73 // <td>Russian</td> 74 // <td>Japanese</td> 75 // <td>English</td> 76 }); 77 78 // 获取文本框的属性值 79 btnclick("btn04",function(){ 80 // 打印id为inputId的输入框的属性值 81 var inputValue = document.getElementById("inputId"); 82 alert(inputValue.value); // 在文本输入框中输入什么,按下按钮后弹出的弹窗就会显示什么 83 // 修改inputValue的属性值 84 inputValue.value = "今天天气不错~" 85 alert("修改后的内容为:"+inputValue.value); // 弹窗内容:修改后的内容为:今天天气不错~ 86 }); 87 88 // nodeValue 文本节点可以通过nodeValue属性获取和设置文本节点的内容 89 btnclick("btn05",function(){ 90 var China = document.getElementById("China"); 91 alert("China.innerHTML:"+China.innerHTML); // China.innerHTML:China,最简洁的写法 92 alert("China.innerText:"+China.innerText); // China.innerText:China 93 alert("China.firstChild.nodeValue:"+China.firstChild.nodeValue); // China.firstChild.nodeValue:China,文本节点 94 }) 95 </script> 96 </body> 97 </html>
1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta charset="UTF-8"> 5 <title>DOM对象元素节点查询4</title> 6 </head> 7 <body> 8 <ul> 9 <li id="liId">社会主义</li> 10 <li id="liId">资本主义</li> 11 <li id="liId">封建主义</li> 12 <li id="liId">法西斯主义</li> 13 <li id="liId">共产主义</li> 14 </ul> 15 <button id="btn01">按钮01</button> 16 <button id="btn02">按钮02</button> 17 <button id="btn03">按钮03</button> 18 19 <script> 20 // document.querySelector() 需要一个选择器的字符串作为参数,可以根据一个CSS选择器来查询一个元素节点对象 21 // 虽然IE8中没有getElementByClassName()但是可以使用querySelector()代替,使用该方法总会返回唯一一个元素 22 // 如果满足条件的元素有多个,那么它只会返回第一个 23 var btn01 = document.getElementById("btn01"); 24 btn01.onclick = function(){ 25 var qSLiId = document.querySelector("#liId"); 26 console.log(qSLiId); // <li id="liId">社会主义</li> 27 console.log(qSLiId.innerHTML); // 社会主义 28 } 29 30 // document.querySelectorAll()该方法与document.querySelecto()用法类似 31 // 不同的是它会将满足条件的元素封装到一个数组中返回,就算符合条件的元素只有一个,也会返回一个数组对象 32 var btn02 = document.getElementById("btn02"); 33 btn02.onclick = function(){ 34 var qSALiId = document.querySelectorAll("#liId"); 35 console.log(qSALiId); // NodeList(5) [li#liId, li#liId, li#liId, li#liId, li#liId] 36 console.log(qSALiId.innerHTML); // undefined 37 for(var i = 0; i < qSALiId.length; i++){ 38 alert(qSALiId[i].innerHTML); 39 } 40 } 41 42 // 其他查询方式 43 var btn03 = document.getElementById("btn03"); 44 btn03.onclick = function(){ 45 alert(document.body); // [object HTMLBodyElement] 代表页面内的body元素 46 alert(document.documentElement); // [object HTMLHtmlElement] 代表页面的html元素 47 alert(document.all); // [object HTMLAllCollection] 代表页面内所有的元素 48 } 49 </script> 50 </body> 51 </html>
最后想说:
上面代码的console.log()和alert(),运行结果都写在该行的注释后面,所使用的浏览器是Chrome浏览器
不建议使用IE浏览器,虽然IE9及以上浏览器运行结果应该都差不多,但是IE8及以下是真的不行(重点批斗对象)
都2200年了应该不会有人还在用IE8吧...不会吧不会吧不会吧...如果不想用Chrome的话可以用Firefox浏览器
该篇随笔适合有一定html、css、JS基础的复习,随便看看也行啦
如果想更深入研究建议自行查看 https://www.w3school.com.cn/index.html