访问关系-封装代码
html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>访问关系封装</title> <style> li{ 100px; height: 100px; background-color: pink; margin: 5px; list-style: none; } </style> </head> <body> <ul> <li></li> <li></li> <li id="box"></li> <li></li> <li></li> </ul> <script src="tools.js"></script> <script> //获取box改为red var box = getEle("box"); box.style.backgroundColor="red"; //获取第一个和最后一个子节点 var parent = box.parentNode; getFirstNode(parent).style.backgroundColor="yellow"; getLastNode(parent).style.backgroundColor="yellow"; //获取上一个下一个兄弟节点 getNextNode(box).style.backgroundColor="blue"; getPrevNode(box).style.backgroundColor="blue"; //指定兄弟节点 getEleOfIndex(box,0).style.backgroundColor="green"; getEleOfIndex(box,1).style.backgroundColor="green"; //获取所有的兄弟节点 var arr = getAllSiblings(box); for(var i=0;i<arr.length;i++){ arr[i].style.backgroundColor = "black"; } // //父节点 // div.parentNode; // // //兄弟节点 // div.previousSibling; // div.previousElementSibling; // div.nextSibling; // div.nextElementSibling; // // //单个子节点 // div.firstChild; // div.firstElementChild; // div.lastChild; // div.lastElementChild; // // //所有子节点 // div.childNodes; // div.children; // // //获取指定的兄弟节点 // div.parentNode.children[index]; // // //获取所有的兄弟节点 // function fn(ele) { // var newArr = []; // var arr = ele.parentNode.children; // for (var i = 0; i < arr.length; i++) { // //如果不是ele元素本身,添加到新数组,老数组里面包含的ele // if (ele !== arr[i]) { // newArr.push(arr[i]); // } // } // } </script> </body> </html>
tool.js
function getEle(id) { return document.getElementById(id) } /** * 功能:给指定元素查找它的第一个元素子节点,并返回 * @param ele * @returns {Element | (() => Node) | ActiveX.IXMLDOMNode | Node | SVGElementInstance} */ function getFirstNode(ele) { var node = ele.firstElementChild || ele.firstChild; return node; } /** * 功能:给指定元素查找它的最后一个元素子节点,并返回 * @param ele * @returns {Element | ActiveX.IXMLDOMNode | Node | SVGElementInstance | (() => Node)} */ function getLastNode(ele) { return ele.lastElementChild || ele.lastChild; } /** * 功能:给定元素查找他的下一个元素兄弟节点,并返回 * @param ele * @returns {Element | null | Node | SVGElementInstance | ActiveX.IXMLDOMNode | (() => Node)} */ function getNextNode(ele) { return ele.nextElementSibling || ele.nextSibling; } /** * 功能:给定元素查找他的上一个元素兄弟节点,并返回 * @param ele * @returns {Element | null | Node | SVGElementInstance | ActiveX.IXMLDOMNode | (() => Node)} */ function getPrevNode(ele) { return ele.previousElementSibling || ele.previousSibling; } /** * 功能:给定元素和索引值查找指定索引值的兄弟节点,并返回 * @param ele * @param index * @returns {Element} */ function getEleOfIndex(ele,index) { return ele.parentNode.children[index]; } /** * 功能:给定元素查找它的所用兄弟元素,并返回数组 * @param ele */ function getAllSiblings(ele) { var newArr = []; var arr = ele.parentNode.children; for (var i = 0; i < arr.length; i++) { //如果不是ele元素本身,添加到新数组,老数组里面包含的ele if (ele !== arr[i]) { newArr.push(arr[i]); } } return newArr; }
style属性特点
1、样式少的时候使用
2、style是对象
3、值是字符串,没有设置值是""
4、命名规则,驼峰命名和css不一祥
5、设置了类样式不能获取(只和行内式交互,和内嵌式外链式无关)
6、box.style.cssText="字符串形式的样式"(可以赋值多个属性)
案例-文本焦点高亮显示
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>文本焦点高亮显示</title> <style> input { display: block; } </style> </head> <body> <ul> <input type="text"/> <input type="text"/> <input type="text"/> <input type="text"/> <input type="text"/> <button>设置</button> </ul> <script> var inpArr = document.getElementsByTagName("input"); var button = inpArr[inpArr.length - 1].nextElementSibling; button.onclick = function () { for (var i = 0; i < inpArr.length; i++) { //当button被点击,所有input绑定事件onfocus inpArr[i].onfocus = function () { this.style.border = "2px solid red"; this.style.backgroundColor = "#ccc"; }; //绑定onblur事件,取消样式 inpArr[i].onblur = function () { this.style.border = ""; this.style.backgroundColor = ""; } } } </script> </body> </html>
案例-百度皮肤
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>百度皮肤</title> <style> *{ padding: 0; margin:0; } body{ background: url(image/3.png) no-repeat; } .box{ height: 200px; padding-top: 30px; text-align: center; background: rgba(255,255,255,0.3); } img{ cursor: pointer; margin: 0 10px; } </style> </head> <body> <div class="box"> <img src="image/1.png" alt="" width="200px"/> <img src="image/2.png" alt="" width="200px"/> <img src="image/3.png" alt="" width="200px"/> <img src="image/4.png" alt="" width="200px"/> <img src="image/5.png" alt="" width="200px"/> </div> <script> //点击图片修改背景图片 var box=document.getElementsByTagName("div")[0]; //body js内部已优化 var body=document.body; var imgArr=box.children; for(var i=0;i<imgArr.length;i++){ imgArr[i].index=i; imgArr[i].onclick = function () { // body.style.backgroundImage = "url(image/"+(this.index+1)+".png)" // body.style.background = "url(image/"+(this.index+1)+".png) no-repeat " //url("http://localhost:63343/dom3/image/2.png") body.style.backgroundImage = "url("+this.src+")"; } } </script> </body> </html>
dom元素的创建
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>dom元素的创建</title> </head> <body> <button>创建</button> <ul> aaa </ul> <script> //1、 document.write创建;会覆盖原来内容 document.write("<li>我是document.write创建的</li>"); var btn=document.getElementsByTagName("button")[0]; var ul=document.getElementsByTagName("ul")[0]; // btn.onclick = function () { // document.write("<li>我是document.write创建的</li>"); // } //2、直接利用元素innerHTML方法。(innerText方法不识别标签,会覆盖原来内容用+=就行) ul.innerHTML += "<li id='li1'>我是innerHTML创建的</li>" //3、利用dom的api创建元素 var newli=document.createElement("li"); newli.innerHTML="我是createElement创建的"; //在赋元素的最后添加元素 // ul.appendChild(newli); //指定位置添加(放在li1之前) var li1=document.getElementById("li1"); ul.insertBefore(newli,li1) </script> </body> </html>
dom元素的操作
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>元素的操作</title> </head> <body> <ul> <li id="li1">参照标签</li> </ul> <script> // document.write()不常用容易覆盖原来的页面 // innerHTML;用的比较多,绑定属性和内容比较方便 //document.createElement;用的比较多,指定数量的时候一般用它 var ul=document.getElementsByTagName("ul")[0]; var li1=document.getElementById('li1'); //创建,添加() var li2=document.createElement("li"); li2.innerText= "我是createElment创建的标签,用的是appendChild的方法"; ul.appendChild(li2); var li3=document.createElement("li"); // li3.id="test"; li3.innerText= "我是createElment创建的标签,insertBefore添加"; //父节点.inserBefore(新节点,参照节点) ul.insertBefore(li3,li1); //删除,替换 ul.removeChild(li3); // 父节点.replaceChild(newNode,oldNode) // var li4=document.createElement("li"); // li4.innerText="test"; ul.replaceChild(li3,li2) //克隆 cloneNode(true),true是深层复制 for(var i=0;i<=3;i++){ var newLi = li3.cloneNode(true); ul.appendChild(newLi); } </script> </body> </html>
案例-选择水果
1、简单版
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>选择水果</title> <style> select{ 170px; height: 200px; font-size: 16px; background-color: #a4ff43; } </style> </head> <body> <select name="" id="sel1" size="10" multiple> <option value="">香蕉</option> <option value="">苹果</option> <option value="">鸭梨</option> <option value="">葡萄</option> </select> <input type="button" value=">>>"/> <input type="button" value="<<<"/> <input type="button" value=">"/> <input type="button" value="<"/> <select name="" id="sel2" size="10" multiple> </select> <script> //点击>>>和<<<两个按钮 var sel1=document.getElementById("sel1"); var sel2=document.getElementById("sel2"); var inpArr=document.getElementsByTagName("input"); inpArr[0].onclick = function () { //获取所有子元素,整体添加到另一个标签中 var arr = sel1.children; for(var i=arr.length-1;i>=0;i--){ //放入select2,不能用push要用appendChild sel2.appendChild(arr[0]); } //也可以在for循环外面定义一个变量 // var arrLen=arr.length-1; // for(var i=0;i<=arrLen;i++){ // //放入select2,不能用push要用appendChild // console.log(i); // // console.log(i); // sel2.appendChild(arr[0]); // } }; inpArr[1].onclick = function () { //获取所有子元素,整体添加到另一个标签中 var arr = sel2.children; for(var i=arr.length-1;i>=0;i--){ //放入select2,不能用push要用appendChild sel1.appendChild(arr[0]); } }; //被选定的子元素跑到对面 // inpArr[2].onclick = function () { // //获取所有子元素,整体添加到另一个标签中 // var arr = sel1.children; // for(var i=arr.length-1;i>=0;i--){ // //放入select2,不能用push要用appendChild // if(arr[i].selected === true){ // sel2.appendChild(arr[i]); // } // } // }; inpArr[2].onclick = function () { var arr=sel1.children; //遍历判断数组中的元素selected属性为true,添加到相反的select标签中 for(var i=arr.length-1;i>=0;i--){ if(arr[i].selected === true){ sel2.appendChild(arr[i]); } } }; inpArr[3].onclick = function () { var arr=sel2.children; //遍历判断数组中的元素selected属性为true,添加到相反的select标签中 for(var i=arr.length-1;i>=0;i--){ if(arr[i].selected === true){ sel1.appendChild(arr[i]); } } } </script> </body> </html>
2、封装版
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>选择水果</title> <style> select{ 170px; height: 200px; font-size: 16px; background-color: #a4ff43; } </style> </head> <body> <select name="" id="sel1" size="10" multiple> <option value="">香蕉</option> <option value="">苹果</option> <option value="">鸭梨</option> <option value="">葡萄</option> </select> <input type="button" value=">>>"/> <input type="button" value="<<<"/> <input type="button" value=">"/> <input type="button" value="<"/> <select name="" id="sel2" size="10" multiple> </select> <script> //点击>>>和<<<两个按钮 var sel1=document.getElementById("sel1"); var sel2=document.getElementById("sel2"); var inpArr=document.getElementsByTagName("input"); inpArr[0].onclick = function () { fn1(sel1,sel2) }; inpArr[1].onclick = function () { fn1(sel2,sel1) }; inpArr[2].onclick = function () { fn2(sel1,sel2) }; inpArr[3].onclick = function () { fn2(sel2,sel1) }; function fn1(ele1,ele2) { //获取所有子元素,整体添加到另一个标签中 var arr = ele1.children; for(var i=arr.length-1;i>=0;i--){ //放入select2,不能用push要用appendChild ele2.appendChild(arr[0]); } } function fn2(ele1,ele2) { var arr=ele1.children; //遍历判断数组中的元素selected属性为true,添加到相反的select标签中 for(var i=arr.length-1;i>=0;i--){ if(arr[i].selected === true){ ele2.appendChild(arr[i]); } } }; </script> </body> </html>
案例-高级隔行变色json_str
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>高级隔行变色</title> <style> *{ padding: 0; margin: 0; text-align: center; } .wrap{ 500px; margin: 100px auto 0; } table{ /*separate在分隔模式下,相邻的单元格都拥有独立的边框。collapse在合并模式下,相邻单元格共享边框。*/ border-collapse: collapse; border-spacing:0; border: 1px solid #c0c0c0; 500px; } th,td{ /*border: 1px solid #d0d0d0;*/ color: #404060; padding: 10px; } th{ background-color: #09c; font: bold 16px "微软雅黑"; color: #fff; } td{ font: 14px "微软雅黑"; } tbody tr{ background-color: #f0f0f0; cursor: pointer; } .current{ background-color: red!important; } </style> </head> <body> <div class="wrap"> <table> <thead> <tr> <th>序号</th> <th>姓名</th> <th>课程</th> <th>成绩</th> </tr> </thead> <tbody id="target"> </tbody> </table> </div> <script> var json_str = [ {"id":"1","name":"张三","kecheng":"英语","fenshu":"100"}, {"id":"2","name":"李四","kecheng":"英语","fenshu":"100"}, {"id":"3","name":"王二","kecheng":"英语","fenshu":"100"}, {"id":"4","name":"孙悟空","kecheng":"英语","fenshu":"100"}, {"id":"5","name":"金角大王","kecheng":"英语","fenshu":"100"}, {"id":"6","name":"金角大王","kecheng":"英语","fenshu":"100"}, {"id":"7","name":"金角大王","kecheng":"英语","fenshu":"100"}, {"id":"8","name":"金角大王","kecheng":"英语","fenshu":"100"}, {"id":"9","name":"金角大王","kecheng":"英语","fenshu":"100"}, ]; var tbody=document.getElementById("target"); for(var i=0;i<json_str.length;i++){ console.log(json_str[i]); tbody.innerHTML += "<tr> " + "<td>"+json_str[i].id+"</td> " + "<td>"+json_str[i].name+"</td> " + "<td>"+json_str[i].kecheng+"</td> " + "<td>"+json_str[i].fenshu+"</td> " + "</tr>" } //通过document.createElement // for(var i=0;i<json_str.length;i++){ // tr=document.createElement("tr"); // td1=document.createElement("td"); // td2=document.createElement("td"); // td3=document.createElement("td"); // td4=document.createElement("td"); // td1.innerText =json_str[i].id; // td2.innerText =json_str[i].name; // td3.innerText =json_str[i].kecheng; // td4.innerText =json_str[i].fenshu; // tbody.appendChild(tr); // tr.appendChild(td1); // tr.appendChild(td2); // tr.appendChild(td3); // tr.appendChild(td4); // tbody.innerHTML += "<tr> " + // "<td>"+json_str[i].id+"</td> " + // "<td>"+json_str[i].name+"</td> " + // "<td>"+json_str[i].kecheng+"</td> " + // "<td>"+json_str[i].fenshu+"</td> " + // "</tr>" // } // var tbody=document.getElementById("target"); var trArr=tbody.children; //循环判断并隔行赋值背景色 for(var i=0;i<trArr.length;i++){ if(i%2!==0){ trArr[i].style.backgroundColor = "#a3a3a3"; }else{ trArr[i].style.backgroundColor = "#ccc"; } //鼠标经过高亮显示 //难点,鼠标移开恢复原本颜色 //计数器(进入tr立刻记录颜色,移开使用记录好的颜色) var color=""; trArr[i].onmouseover = function () { //赋值颜色之前记录颜色 color=this.style.backgroundColor; this.style.backgroundColor = "#fff"; }; trArr[i].onmouseout = function () { this.style.backgroundColor = color; } } </script> </body> </html>
案例-模拟百度搜索
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>模拟百度搜索</title> <style> *{ margin: 0; padding: 0; } .box{ 500px; margin: 200px auto; } ul{ 392px; padding: 5px; list-style: none; border: 1px solid red; } li:hover{ background-color: red; } input{ 400px; } button{ 70px; } </style> </head> <body> <div class="box"> <input type="text"/> <button>搜索</button> <!--<ul>--> <!--<li>aaa</li>--> <!--<li>bbb</li>--> <!--<li>ccc</li>--> <!--</ul>--> <script> //需求:输入内容(输入事件,键盘弹起事件) var arr = ["a","ab","abc","abcd","baa","aab"]; var box = document.getElementsByTagName("div")[0]; var inp = box.children[0]; //绑定事件 inp.onkeyup = function () { var newArr=[]; //创建一个字符串,里面添加满了li和对应的内容 //遍历老数组,那项是以input内容为开头的 for(var i=0;i<arr.length;i++){ //是否以input内容为开头的 var val=this.value; if(arr[i].indexOf(val)===0){ newArr.push("<li>"+arr[i]+"</li>"); } } //把创建好的内容添加到ul var str=newArr.join(""); // var aa = document.getElementsByTagName("ul")[0]; //1 如果ul存在,删除 if(box.children[2]){ //只要存在那么就是object类型 box.removeChild(box.children[2]); } //2 内容为空那么不能生成ul //3 如果数组中没有input字符开头的元素,切断函数 //换个说法,newArr长度为0 if(this.value.length===0 || newArr.length === 0){ //切换函数 return; } var ul = document.createElement("ul"); ul.innerHTML = str; box.appendChild(ul) } </script> </div> </body> </html>