9.17学习内容
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Day3</title> <style> #dv3 img { display: inline-block; height: 100px; width: 150px; cursor: pointer; } #dv6{ height: 200px; width: 200px; border: 1px dashed #af521b; } </style> </head> <body> <script> //节点:Node所有的内容都是一个节点 可以分为标签、属性、文本 //节点的属性:nodeType:节点类型:标签节点:1; 属性节点:2; 文本节点:3; // nodeName:节点名:标签节点:大写标签名; 属性节点:小写属性名; 文本节点:#text; // nodeValue:节点内容:标签节点:null; 属性节点:属性值; 文本节点:文本内容; //获取节点的方式:parentNode----获取父节点 // parentElement----获取父元素 元素就是一个节点,一般来说,一个父级元素如果包含子节点,那么这个父级 // 元素很可能就是一个标签节点,所以说获取父元素实际上和获取父节点意义相同。 // chlidNodes----获取子节点--得到伪数组 // chlidren----获取子元素---得到伪数组 子节点和子元素不同!子节点包括文本节点,子元素只有标签节点 // // firstChild----获取第一个子节点 // firstElementChild----获取第一个子元素 // // lastChild----最后一个子节点 // lastElementChild----最后一个子元素 // // previousSibling----前一个兄弟节点 // previousElementSibling----前一个兄弟元素 // // nextSibling----后一个兄弟节点 // nextElementChild----后一个兄弟元素 // // getAttributeNode("属性名")----根据属性名获取属性节点 </script> <div id="dv1"> <p>文本</p> <input type="text" name="" id=""> <a href=""></a> <ul id="uu"> <li>蒹葭苍苍</li> <li>白露为霜</li> <li>所谓伊人</li> <li>在水一方</li> </ul> </div> <script> var uObj = document.getElementById("uu"); console.log(uObj.parentNode); console.log(uObj.parentElement); console.log(uObj.parentNode.nodeType); console.log(uObj.parentNode.nodeName); console.log(uObj.parentNode.nodeValue); var dvObj = document.getElementById("dv1"); console.log(dvObj.childNodes); console.log(dvObj.children); console.log(dvObj.getAttributeNode("id")); </script> <!-- 案例:用节点的方式修改标签样式 --> <div id="dv2"> <p>1</p> <span>2</span> <p>1</p> <span>2</span> <p>1</p> <a href="#">3</a> <br/> <span>2</span> <p>1</p> </div> <script> var dv2 = document.getElementById("dv2"); var dv2Nodes = dv2.childNodes; for (var i = 0; i < dv2Nodes.length; i++) { if (dv2Nodes[i].nodeType == 1 && dv2Nodes[i].nodeName == "P") { dv2Nodes[i].style.backgroundColor = "pink"; } } </script> <!-- 案例:利用节点实现隔行变色 --> <ul id="uu2"> <li>1</li> <li>2</li> <li>3</li> <li>4</li> <li>5</li> <li>6</li> <li>7</li> <li>8</li> </ul> <script> var num = 0; var liObj = document.getElementById("uu2").childNodes; for (var i = 0; i < liObj.length; i++) { if (liObj[i].nodeType == 1 && liObj[i].nodeName == "LI") { //liObj[i].style.backgroundColor = i%2 == 0 ? "red" : "yellow"; //结果全是yellow。因为获取子节点包括了文本节点,其中li标签就是第2.4.6.8...个子节点,对应索引就是第1.3.5.7...,为奇数,所以改变样式这行代码中的i都是奇数,结果全换成了yellow num++ //为li子节点计数,以便于计算是第奇数个li还是第偶数个li(对2取余 ==0?) liObj[i].style.backgroundColor = num%2 == 0 ? "red" : "yellow"; } } </script> <!-- 案例:切换背景图片 --> <div id="dv3"> <img src="images/1.jpg" alt=""> <img src="images/2.jpg" alt=""> <img src="images/3.jpg" alt=""> </div> <script> var imgObj = document.getElementById("dv3").children; for (var i = 0; i < imgObj.length; i++) { imgObj[i].onclick = function(){ //document.body.style.backgroundImage = "url(this.src)"; //这样不行,url(this.src)真个被看成了字符串 document.body.style.backgroundImage = "url("+this.src+")"; //另外要注意js设置CSS样式,应该为 属性 = "属性值";这里用"url("+this.src+")"得到的结果还是字符串,可以实现。 // 例 //document.body.style.backgroundColor = pink; //这里属性值没加""报错 //document.body.style.backgroundColor = "pink"; //实现 }; } </script> <!-- 案例 :全选 --> <div id="dv4"> <table border="1"> <thead style="background-color: skyblue;"> <tr> <td> <input type="checkbox"></td> <td>全选</td> </tr> </thead> <tbody> <tr> <td> <input type="checkbox"></td> <td>吃饭</td> </tr> <tr> <td> <input type="checkbox"></td> <td>睡觉</td> </tr> <tr> <td> <input type="checkbox"></td> <td>打豆豆</td> </tr> </tbody> </table> </div> <script> //获取元素 var dv4 = document.getElementById("dv4"); var hd = dv4.getElementsByTagName("thead")[0].getElementsByTagName("input")[0]; var bd = dv4.getElementsByTagName("tbody")[0].getElementsByTagName('input'); //设置全选全不选 hd.onclick = function(){ // if (this.checked) { //checked获取元素的选中状态,返回一个布尔值 // for (var i = 0; i < bd.length; i++) { // bd[i].checked = true; // } // }else{ // for (var i = 0; i < bd.length; i++) { // bd[i].checked = false; // } // } //简化代码 for (var i = 0; i < bd.length; i++) { bd[i].checked = this.checked; } }; //设置根据下面的状态改变全选的复选框 for (var i = 0; i < bd.length; i++) { bd[i].onclick = function(){ var flag = true; //默认全选 for (var j = 0; j < bd.length; j++) { //遍历,如果有没选中的则设置flag = false if (!bd[j].checked) { flag = false } //没设置else,即全都选中了的话flag为默认值 } hd.checked = flag; }; } </script> <!-- 创建元素:某些元素内容不是必须的,用户需要时才加载的东西,可以根据事件创建新元素,这样可以减少网页加载时获取的资源,提高用户体验 --> <!-- 创建元素的方式: 1.document.write("新元素") 2.对象.innerHTML = "" 回忆 对象.innerText = "":不能创建新元素,只能获取和写入文本 3.document.createElement("标签名"); 此方法创建一个标签,还需要用其他方法写入标签内容以及将新标签追加到父元素中 --> <input type="button" value="创建一个新标签" id="btn1"> <input type="button" value="创建一个新标签" id="btn2"> <input type="button" value="创建一个新标签" id="btn3"> <div id="dv5"></div> <script> //点击按钮创建新标签 document.getElementById("btn1").onclick = function(){ document.write("<p>这是一个新标签</p>"); //document.write()方法在页面加载完毕之后使用会用新元素覆盖所有的原有元素 }; document.write("<p>这是另一个新标签</p>"); //在页面加载时使用document.write()方法不会覆盖 document.getElementById("btn2").onclick = function(){ document.getElementById("dv5").innerHTML = "<p>这是一个新标签</p>"; //innerHTML:以赋值的方式创建,每次都会覆盖原有内容,创建写好的内容。 }; document.getElementById("btn3").onclick = function(){ var pObj = document.createElement("p"); //创建新标签 pObj.innerText = "这是一个新标签"; //写入内容 document.getElementById("dv5").appendChild(pObj); //将创建的新标签追加到想要放的地方 }; </script> <!-- 案例:用两种方式创建新列表 --> <input type="button" value = "创建" id="btn4"> <input type="button" value = "创建" id="btn5"> <div id="dv6"></div> <script> var names = ["氢","氦","锂","铍","硼"]; var dv6 = document.getElementById("dv6"); //方式1利用innerHTML document.getElementById("btn4").onclick = function(){ //利用循环编写innerText里的内容 var str = "<ul>"; for (var i = 0; i < names.length; i++) { str += "<li>" + names[i] + "</li>"; } str += "</ul>"; dv6.innerHTML = str; //循环注册鼠标经过的效果 var liObj = dv6.getElementsByTagName("ul")[0].children; //直接getElementsByTagName("li") for (var i = 0; i < liObj.length; i++) { liObj[i].onmouseover = function(){ this.style.backgroundColor = "skyblue"; //注意,这里的this不能用liObj[i]!! }; liObj[i].onmouseout = function(){ this.style.backgroundColor = ""; //注意,这里的this不能用liObj[i]!! }; } }; //方式2利用document.createElement document.getElementById("btn5").onclick = function(){ var ulObj = document.createElement("ul"); //创造一个ul dv6.appendChild(ulObj); //放入目标地方 for (var i = 0; i < names.length; i++) { //循环创造li元素并注入 var li = document.createElement("li"); li.innerText = names[i]; ulObj.appendChild(li); } //循环注册鼠标经过的效果 var liObj = dv6.getElementsByTagName("li"); for (var i = 0; i < liObj.length; i++) { liObj[i].onmouseover = mouseoverHandle; liObj[i].onmouseout = mouseoutHandle; //这里创建了两个命名函数,好处:节省空间,在for循环中只利用了两个函数的空间。而在方式1中的for循环中,每个i都创建了两个匿名函数,使用了两个对应的内存空间。 //总结:循环中最好使用命名函数,不是循环的事件函数最好用匿名函数 } function mouseoverHandle(){ this.style.backgroundColor = "skyblue"; } function mouseoutHandle(){ this.style.backgroundColor = ""; } }; </script> <!-- 元素的一些方法: 1 父元素.appendChild(新元素) 在父元素的内部后面追加新元素 2 父元素.insertBefore(新元素,参照元素)在参照元素外面的前面插入新元素 3 父元素.replaceChild(新元素,参照元素)将参照元素替换为新元素 4 父元素.removeChild(元素)移除父元素中的指定元素 --> <br> <input type="button" value="在c后面插入" id="btn6"> <input type="button" value="在a前面插入" id="btn7"> <input type="button" value="替换b" id="btn8"> <input type="button" value="移除c" id="btn9"> <div id="dv7"> <p>a</p> <span>b</span> <h3>c</h3> </div> <script> var dv7 = document.getElementById("dv7"); document.getElementById("btn6").onclick = function(){ var newElement = document.createElement("input"); newElement.type = "button"; newElement.value = "新元素"; dv7.appendChild(newElement); }; //这一比较这两个格式,下面这个无法实现多次点击插入多个,因为这个新元素是在点击事件之外创建的,每次点击调用的都是这一个新元素, appendChild()方法特别注意:如果文档树中已经存在了这个新元素,它将从文档树中删除,然后重新插入它的新位置。利用appendChild()可以实现改变元素位置的操作 // var dv7 = document.getElementById("dv7"); // var newElement = document.createElement("input"); // newElement.type = "button"; // newElement.value = "新元素"; // document.getElementById("btn6").onclick = function(){ // dv7.appendChild(newElement); // }; // document.getElementById("btn7").onclick = function(){ //这个事件用来测试新元素已经存在的情况下的结果 // dv6.appendChild(newElement); // }; document.getElementById("btn7").onclick = function(){ var newElement = document.createElement("input"); newElement.type = "button"; newElement.value = "新元素"; dv7.insertBefore(newElement, dv7.firstElementChild); }; document.getElementById("btn8").onclick = function(){ var newElement = document.createElement("input"); newElement.type = "button"; newElement.value = "新元素"; dv7.replaceChild(newElement, dv7.getElementsByTagName("span")[0]); }; document.getElementById("btn9").onclick = function(){ var newElement = document.createElement("input"); newElement.type = "button"; newElement.value = "新元素"; dv7.removeChild(dv7.lastElementChild); }; </script> <!-- 如何实现利用document.createElement多次触发不会创建多个元素:有则删除,无则创建 --> <!-- 如何为同一个元素的同一个事件绑定多个事件处理函数 : 若直接编写多个事件函数,后面的会覆盖前面的 方法:元素.addEventListener("事件名-去除on","事件处理函数","false"); --> <button id="btn10" value="">按钮</button> <div id="dv8" style="width: 100px; height: 100px; border: 1px solid yellow;"></div> <script> var btn10 = document.getElementById("btn10"); var dv8 = document.getElementById("dv8"); btn10.addEventListener("click", function(){ dv8.style.backgroundColor = "pink"; // dv8.style.background = "pink"; }, false); btn10.addEventListener("click", function(){ dv8.innerText = "叽叽叽叽鸡"; }, false); btn10.addEventListener("click", function(){ dv8.style.textAlign = "center"; }, false); //可以看出三个事件函数都能发生 </script> </body> </html>