节点的创建
- document.createElement() 方法用于创建一个指定标签名的HTML元素。
“孤儿节点”
- 新创建出的节点是“孤儿节点”,这意味着它并没有被挂载到DOM树上,我们无法看见它。
必须继续使用appendChild()或insertBefore()方法将孤儿节点插入到DOM树上。
appendChild()
- 任何已经在DOM树上的节点,都可以调用appendChild()方法,它可以将孤儿节点挂载到它的内部,成为它的最后一个子节点。
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> </head> <body> <div id="box1"> <p>1</p> <p>1</p> <p>1</p> </div> <script> var box1 = document.getElementById('box1'); // 创建p元素节点 var oP = document.createElement('p'); // 挂载到box1内部 box1.appendChild(oP); </script> </body> </html>
insertBefore()
- 任何已经在DOM树上的节点,都可以调用insertBefore()方法,它可以将孤儿节点挂载到它的内部,成为它的“标杆子节点”之前的节点。
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> </head> <body> <div id="box1"> <p>1</p> <p>1</p> <p class="para">1</p> </div> <script> var box1 = document.getElementById('box1'); // 标杆节点 var para = box1.querySelector('p.para'); // 创建p元素节点 var oP = document.createElement('p'); // 挂载到para之前 box1.insertBefore(oP, para); </script> </body> </html>
小练习
- 请动态创建出一个20行12列的表格。
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> <style> td { width: 20px; height: 5px; border: 1px solid #000; } </style> </head> <body> <table id="mytable"></table> <script> // 请动态创建出一个20行12列的表格 var mytable = document.getElementById('mytable'); for (var i = 0; i < 20; i++) { // 创建了新的tr标签 var tr = document.createElement('tr'); for (var j = 0; j < 12; j++) { // 创建了新的td标签 var td = document.createElement('td'); // 让tr追加td标签 tr.appendChild(td); } // 让mytable追加tr标签 mytable.appendChild(tr); } </script> </body> </html>
- 请制作九九乘法表(可以在刚才代码基础上改动升级)。
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> <style> td { width: 60px; height: 30px; text-align: center; border: 1px solid #000; } </style> </head> <body> <table id="mytable"></table> <script> // 请创建九九乘法表 var mytable = document.getElementById('mytable'); for (var i = 1; i <= 9; i++) { // 创建了新的tr标签 var tr = document.createElement('tr'); for (var j = 1; j <= i; j++) { // 创建了新的td标签 var td = document.createElement('td'); // 设置td内部的文字 td.innerText = i + '*' + j + '=' + (i * j); // 让tr追加td标签 tr.appendChild(td); } // 让mytable追加tr标签 mytable.appendChild(tr); } </script> </body> </html>
移动节点
- 如果将已经挂载到DOM树上的节点成为appendChild()或者insertBefore()的参数,这个节点将会被移动。
- 这意味着一个节点不能同时位于DOM树的两个位置。
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> </head> <body> <div id="box1"> <p id="para">我是段落</p> </div> <div id="box2"> <p>我是box2的原有p标签</p> <p>我是box2的原有p标签</p> <p>我是box2的原有p标签</p> <p>我是box2的原有p标签</p> </div> <script> var box1 = document.getElementById('box1'); var box2 = document.getElementById('box2'); var para = document.getElementById('para'); var ps_inbox2 = box2.getElementsByTagName('p'); // box2.appendChild(para); box2.insertBefore(para, ps_inbox2[0]); </script> </body> </html>
删除节点
- removeChild() 方法从DOM中删除一个子节点。
- 节点不能主动删除自己,必须由父节点删除它。
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> </head> <body> <div id="box"> <p>我是p节点0</p> <p>我是p节点1</p> <p>我是p节点2</p> </div> <script> var box = document.getElementById('box'); var the_first_p = box.getElementsByTagName('p')[0]; box.removeChild(the_first_p); </script> </body> </html>
克隆节点
- cloneNode() 方法可以克隆节点,克隆出的节点是“孤儿节点”。
- 参数是一个布尔值,表示是否采用深度克隆:如果为true,则该节点的所有后代节点也都会被克隆,如果为false,则只克隆该节点本身。
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> </head> <body> <div id="box1"> <ul> <li>牛奶</li> <li>咖啡</li> <li>可乐</li> </ul> </div> <div id="box2"></div> <div id="box3"></div> <script> var box1 = document.getElementById('box1'); var box2 = document.getElementById('box2'); var box3 = document.getElementById('box3'); var theul = box1.getElementsByTagName('ul')[0]; // 克隆节点 // 深度克隆 var new_ul1 = theul.cloneNode(true); box2.appendChild(new_ul1); // 非深度克隆 var new_ul2 = theul.cloneNode(false); box3.appendChild(new_ul2); </script> </body> </html>