前端基本功---webAPI(3)案例

    xiaoxiao2025-07-11  5

    1、总结

    <!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <script> 1. 操作表单元素的属性: 像disabled , checked, selected 这类在html中,只需要属性名的属性, 在JS中,用true/false来控制 2. 操作元素的样式: 行内 : style 元素.style.width = 100 + 'px'; 类名 : className 直接赋值会覆盖原来的类名 3. 操作标签的自定义属性 获取 getAttribute('属性名') 设置 setAttribute('属性名', '属性值') 移除 removeAttribute('属性名') </script> </body> </html>

    2、节点

    <!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <div id="box"> 文本 <span>span</span> <!--这是注释--> </div> </body> </html>

    3、DOM树

    <!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <script> // 一个html页面中的所有内容都是节点 // 当浏览器加在一个html页面的时候,会把页面中的所有内容加载到内存中,按照他们的关联关系组织管理起来.他们的这种关联关系,看起来像一棵树.所以我们把他们在内存中的存储形式称之为是DOM树. // // 结论:如果元素在dom树上,会渲染,不在dom树上就不会渲染出来 </script> </body> </html>

    4、节点的类型的属性

    <!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <div id="box"> 文本啊 <span>span</span> <p> 这是p <span>这是span</span> </p> <!--这是注释--> </div> <script> var box = document.getElementById('box'); // console.log(box); //浏览器的优化行为: 当做标签打印在控制台上 // console.dir(box); // 以对象的形式打印在控制台上 // // box.nodeType //返回节点的类型 标签节点是 1 // box.nodeName //返回的是节点的名称 大写的标签名 // box.nodeValue // 标签节点的nodeValue 永远是null console.log(box.childNodes); //返回box里面的所有子节点 </script> </body> </html>

    5、节点层级的属性

    <!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <div id="wrap"> <p>兄弟</p> <div id="box"> 文本啊 <span>span</span> <p> 这是p <span>这是span</span> </p> <!--这是注释--> </div> <span>span兄弟</span> </div> <script> //主要讨论的就是标签节点的层级(其实就是标签的兄弟,父子关系) var box = document.getElementById('box'); // 找儿子: // childNodes 返回所有子节点 // children 返回的所有的子元素(子标签节点) // console.log(box.childNodes); //返回伪数组,存储了所有的子节点 // console.log(box.children); // 找父亲: // parentNode 返回父节点 (父元素) // console.log(box.parentNode); // 找兄弟: // nextElementSibling //返回下一个兄弟元素 // previousElementSibling //返回上一个兄弟元素 // console.log(box.nextElementSibling); console.log(box.previousElementSibling); </script> </body> </html>

    6、操作节点的方法

    <!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <p id="p">123</p> <div id="box"> <span>span</span> </div> <script> // 添加节点的方法: // 父节点.appendChild(子节点)// 添加子节点 有剪切的效果 var box = document.getElementById('box'); var p = document.getElementById('p'); // box.appendChild(p); // 父节点.insertBefore(要添加的子节点, 参考的子节点) 有剪切的效果 var span = document.getElementsByTagName('span')[0]; // box.insertBefore(p, span); //移除节点的方法: //父节点.removeChild(子节点) // box.removeChild(span); // 替换节点 // 父节点.replaceChild(替换的子节点, 被替换的子节点) 有剪切的效果 // box.replaceChild(p, span); //克隆节点 // 节点.cloneNode(true/false) 不传 就是相当于传了一个false //console.log(box.cloneNode()); //只克隆节点本身 //console.log(box.cloneNode(true)); // 总结: 添加节点的方法: appendChild insertBefore(要插入的节点, 参考节点) 替换节点的方法: replaceChild(要替换的节点, 被替换的节点) //以上这三个都有剪切的效果 移除节点的方法: removeCHild 克隆节点的方法: cloneNode(true/false) 传true就是克隆所有,不传就是只克隆节点本身 </script> </body> </html>

    7、操作水果的案例

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <style> select { width:200px; height: 200px; background-color: #33cccc; font-size: 20px; } </style> </head> <body> <select id="all" multiple="multiple"> <option>苹果</option> <option>橘子</option> <option>梨</option> <option>西瓜</option> <option>水蜜桃</option> </select> <input type="button" value=">>" id="btn1"> <input type="button" value="<<" id="btn2"> <input type="button" value=">" id="btn3"> <input type="button" value="<" id="btn4"> <select id="select" multiple="multiple"> </select> <script> // 需求: >> 左边都到右边 > 左边选中的到右边 // 1. >> 左边的all里面的option都到右边的select // 1.1 获取元素 var all = document.getElementById('all'); var select = document.getElementById('select'); var options = all.getElementsByTagName('option'); // var options = all.querySelectorAll('option'); var btn1 = document.getElementById('btn1'); // 1.2 给元素注册事件 btn1.onclick = function(){ // 1.3 在事件处理函数中,让all里面的option 都添加到select里面 appendChild for(var i = 0; i < options.length; i++) { select.appendChild(options[i]); i--; //由于appendChild之后,options中的元素的下标会发生变化,所以i--.是为了让i永远为0 } // for(var i = 0; i < options.length; ) { // select.appendChild(options[i]); // } // for(var i = 0, leng = options.length; i < leng; i++){ // select.appendChild(options[0]); // } // for(;;){ // console.log(1); // } // } //2. > 左边all选中的option移动到右边select //2.1 获取元素 btn3 var btn3 = document.querySelector('#btn3'); // 2.2 给btn3注册点击事件 btn3.onclick = function(){ // 2.3 在事件处理函数中,让左边的选中的到右边 // 2.3.1 如何判断哪些选中了? option.selected == true证明选中 for(var i = 0; i < options.length; i++) { if(options[i].selected){ // 2.3.2 选中的就移动到select里面 select.appendChild(options[i]); i--;//只有移动了,options中的下标才会发生变化,所以,如果移动了,就让i--.让i保持不变 } } } </script> </body> </html>

    8、总结二

    <!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <script> // 1. 节点类型的属性: nodeType 标签节点: 1 nodeName 标签节点: 大写的标签名 nodeValue 标签节点: null // 2. 节点层级的属性: 找儿子: children 子元素 childNodes 子节点 找父亲: parentNode 父节点 找兄弟: nextElementSibling 下一个兄弟元素 previousElementSibling 上一个兄弟元素 // 3. 操作节点的方法: 添加节点: appendChild() 往后面加 有剪切的效果 insertBefore(新, 旧) 在指定子节点前面加 有剪切的效果 替换节点: replaceChild(新, 旧) 有剪切的效果 移除节点: removeChild(子节点) 克隆节点: cloneNode(true/false) 传true,全部复制, 不传就是只复制节点本身 </script> </body> </html>

    9、动态创建元素

    <!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <button id="btn">按钮</button> <div id="box"></div> <script> // innerHTML 可以识别标签 可以用来动态的创建元素,并且直接渲染到了页面上 // var box = document.getElementById('box'); box.innerHTML = '<span>这是一个span</span>'; // document.createElement('标签名') //专门用来创建元素, 返回一个新的元素,但是这个元素不在dom树上 // var p = document.createElement('p'); //console.log(p); // box.appendChild(p); // document.write('html形式的字符串') ; //这个方法只能用document调用 // document.write('<h1>doucment.write加上来的</h1>'); // 直接写在script里面,不会覆盖原来的内容 // var btn = document.getElementById('btn'); // btn.onclick = function(){ // document.write('<h1>点击之后添加的</h1>'); //放大事件函数里面,会覆盖原来的内容 // } </script> </body> </html>

    10、动态创建列表案例

    <!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <button id="btn"> 点击按钮,假装去服务器拿数据</button> <div id = "container"> </div> <script> var arr = ['html', 'css', 'es5.0js', 'dom'] //需求: 点击按钮,根据arr的数据,动态的创建无序列表,之后,每 // 1. 根据arr的数据,动态的创建无序列表 // 1.1 获取元素 btn container var btn = document.getElementById('btn'); var container = document.getElementById('container'); // 1.2 给按钮注册点击事件 btn.onclick = function(){ // 1.3 在事件处理函数中,根据arr创建无序列表 innerHTML // container.innerHTML = '<ul><li>html</li><li>css</li><li>es5.0js</li><li>dom</li></ul>'; // 1.3.1 根据arr的数据,把字符串拼出来 var str = '<ul>'; for(var i = 0; i < arr.length; i++) { str += '<li>'+arr[i]+'</li>'; } str += '</ul>'; console.log(str); // 1.3.2 直接赋值即可 container.innerHTML = str; // 2. 鼠标移入到li,当前li高亮 // 2.1 获取元素 var lis = document.getElementsByTagName('li'); // 2.2 给每一个li注册mouseover事件 for(var i = 0; i < lis.length; i++) { lis[i].onmouseover = fn; } function fn(){ // 2.3 在事件处理函数中 // 2.3.1 先排他 for(var i = 0; i < lis.length; i++) { lis[i].style.backgroundColor = ''; } // 2.3.2 让当前的里高亮 this this.style.backgroundColor = '#ccc'; } } </script> </body> </html>

    11、动态创建表格

    <!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8"> <title>Title</title> <style> table{ border-collapse: collapse; } </style> </head> <body> <!--<table border="1px" width="300px">--> <!--<thead style="background-color: #ccc">--> <!--<tr>--> <!--<th>haha </th>--> <!--<th>hehe </th>--> <!--</tr>--> <!--</thead>--> <!--<tbody align="center">--> <!--<tr>--> <!--<td>123</td>--> <!--<td>345</td>--> <!--</tr>--> <!--</tbody>--> <!--</table>--> </body> <script> // 数据行 中的数据 var bodyData = [ {name: 'zs', subject: '语文', score: 100}, {name: 'ls', subject: '数学', score: 80}, {name: 'sdb', subject: '体育', score: 0}, {name: 'gw', subject: '英语', score: 59}, {name: 'bzr', subject: '数学', score: 50} ]; // 表头数据 var headData = ['姓名', '科目', '成绩', '操作']; //需求:根据数据动态创建表格, 还要增加一个删除的操作 // 1. 先创建表格的基本机构 // 1.1. 创建table标签 var table = document.createElement('table'); table.border = '1px'; table.width = '500px'; // 1.2 创建thead var thead = document.createElement('thead'); thead.style.backgroundColor = '#ccc'; table.appendChild(thead); // 1.3 创建tbody var tbody = document.createElement('tbody'); tbody.align = 'center'; table.appendChild(tbody); // 2. 完成表头部分 // 2.1 创建表头中的tr var tr = document.createElement('tr'); thead.appendChild(tr); // 2.2 根据headdata中的数据,创建tr中的th for(var i = 0; i < headData.length; i++) { var th = document.createElement('th'); th.innerText = headData[i]; tr.appendChild(th); } //3. 完成表体 // 3.1.根据bodyData中对象的个数,决定创建多少个tr for(var i = 0; i < bodyData.length; i++) { var tr = document.createElement('tr'); //3.2 创建每一个tr的td td的个数是对象中键值对的个数 + 1 for(var key in bodyData[i]){ var td = document.createElement('td'); td.innerText = bodyData[i][key]; tr.appendChild(td); } // 加上后面的那个td var td = document.createElement('td'); //删除是一个a元素 var a = document.createElement('a'); a.innerText = '删除'; a.href = ''; //没有href属性,a元素就相当于一个普通的标签.没有超链接的效果 td.appendChild(a); tr.appendChild(td); tbody.appendChild(tr); //给每一个a注册点击事件,在事件处理函数中,删除当前行 a.onclick = fn; } // 删除点击时,调用的函数 function fn(){ // 删除当前行 tbody.removeChild(tr) // console.log(this.parentNode.parentNode); var result = confirm('您确定要删除吗?'); if(result){ tbody.removeChild(this.parentNode.parentNode); } return false; } //最后把table加到dom树上,这样就只会渲染一次 document.body.appendChild(table); //for..in var obj = { name: 'zs', age: 18, score : 100 } for(var key in obj){ // console.log(key); // console.log(obj[]); // console.log(obj['age']); //中括号语法里面,允许写字符串/数字/变量 // console.log(obj.key); //.后面写什么就去对象中找对应的那个属性 console.log(obj[key]); } </script> </html>

    12、扩展

    <!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <div id="box"> <!--注释--><p id="p">p</p><span></span> <div>div</div> </div> <script> //其他节点层级的属性 // 其他找儿子的: // firstChild 第一个子节点 // firstElementChild 第一个子元素 // lastChild 最后一个子节点 // lastElementChild 最后一个子元素 // console.log(box.firstChild); // console.log(box.lastChild); // console.log(box.firstElementChild); // console.log(box.lastElementChild); // console.log(p.nextSibling); //下一个兄弟节点 // console.log(p.previousSibling); //上一个兄弟节点 </script> </body> </html>

    13、效率测试

    (1)效率测试-1.html

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>效率测试</title> </head> <body> </body> <script> function fn() { var d1 = +new Date(); for ( var i = 0; i < 1000; i++ ) { document.body.innerHTML += '<div style="width:100px; height:2px; border:1px solid blue;"></div>'; } var d2 = +new Date(); console.log( d2 - d1 ); } fn(); </script> </html>

    (2)效率测试-2.html

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>效率测试</title> </head> <body> </body> <script> function fn() { var d1 = +new Date(); var array = []; for ( var i = 0; i < 1000; i++ ) { array.push('<div style="width:100px; height:2px; border:1px solid blue;"></div>'); } // console.log(array); document.body.innerHTML = array.join(''); var d2 = +new Date(); console.log( d2 - d1 ); } fn(); </script> </html>

    (3)效率测试-3

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>效率测试</title> </head> <body> </body> <script> function fn() { var d1 = +new Date(); for ( var i = 0; i < 1000; i++ ) { var div = document.createElement('div'); div.style.width = '100px'; div.style.height = '2px'; div.style.border = '1px solid red'; document.body.appendChild( div ); } var d2 = +new Date(); console.log( d2 - d1 ); } fn(); </script> </html>

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

    最新回复(0)