1.节点创建 appendChild()

appendChild => Node.prototype
增加子节点,不光元素节点,还有注释节点等

  1. // appendCHlid => Node.prototype
  2. var a = document.getElementsByTagName('a')[0];
  3. console.log(a);
  4. var div = document.createElement('div');//添加到内存中,不是到dom树中
  5. div.innerHTML='<p>我是段落标签</p>';
  6. document.body.appendChild(div);
  1. <a href="#">我是超链接</a>
  2. <script>
  3. var a=document.getElementsByTagName('a')[0];
  4. console.log(a);
  5. var div=document.createElement('div');
  6. //创建[object HTMLDivElement]到内存中
  7. div.innerHTML='<p>我是段落标签</p>';
  8. document.body.appendChild(div)
  9. </script>

image.png
image.png
添加代码,在最下面

image.png
含有剪切节点功能

  1. // appendCHlid => Node.prototype
  2. var a = document.getElementsByTagName('a')[0];
  3. console.log(a);
  4. var div = document.createElement('div');
  5. div.innerHTML='<p>我是段落标签</p>';
  6. document.body.appendChild(div);
  7. div.appendChild(a);

image.png

  1. <a href="#">我是超链接</a>
  2. <script>
  3. var a=document.getElementsByTagName('a')[0];
  4. console.log(a);
  5. var div=document.createElement('div');
  6. div.innerHTML='<p>我是段落标签</p>';
  7. document.body.appendChild(div)
  8. div.appendChild(a);
  9. </script>

image.png

image.png
image.png
改变DOM树
还有剪切功能,把body中的剪切到div中,不是复制
image.png
是之前的,把之前写到html中的a元素剪切到div中
image.png

  1. <a href="#">我是超链接</a>
  2. <script>
  3. // var a = document.getElementsByTagName('a')[0];
  4. // console.log(a);
  5. // var div = document.createElement('div');
  6. // div.innerHTML = '<p>我是段落标签</p>';
  7. // document.body.appendChild(div)
  8. // div.appendChild(a);
  9. var div=document.createElement('div');
  10. div.innerHTML = '123';
  11. document.body.appendChild(div);
  12. // createTextNode()
  13. var text=document.createTextNode('456')
  14. document.body.appendChild(text);
  15. // document.createElement('');
  16. var comment=document.createComment('我是注释君')
  17. document.body.appendChild(comment)
  18. </script>

image.png
image.png

2.节点的插入 insertBefore()

insertBefore()

  1. var div = document.getElementsByTagName('div')[0];
  2. var p = document.getElementsByTagName('p')[0];
  3. var h1 = document.createElement('h1');
  4. h1.innerHTML = '我是h1标签';
  5. div.insertBefore(h1,p);
  6. // c.insertBefore(a,b);
  7. // 插入:在父级c节点下的子节点b之前插入a节点

image.png

  1. <div>
  2. <h1>标题标签</h1>
  3. <p>我是段落标签</p>
  4. <a href="">我是超链接标签</a>
  5. </div>
  6. <script>
  7. var div=document.getElementsByTagName('div')[0];
  8. var p=document.getElementsByTagName('p')[0];
  9. var h1=document.createElement('h1');
  10. h1.innerHTML = '我是h1标签';
  11. div.insertBefore(h1, p);
  12. </script>

image.png

image.png

image.png

3.节点的删除 removeChild()

removeChild()在dom树种删除 若未保存 则自动被内存删除

  1. var div = document.getElementsByTagName('div')[0];
  2. var p = document.getElementsByTagName('p')[0];
  3. var a = document.getElementsByTagName('a')[0];
  4. var h1 = document.getElementsByTagName('h1')[0];
  5. div.removeChild(h1);

image.png

remove()

remove IE不支持

innerHTML innerText

innerHTML => HTML.Element.prototype 、Element.prototype
innerText => HTML.Element.prototype

innerHTML

image.png

  1. <div>
  2. <h1>标题标签</h1>
  3. <p>我是段落标签</p>
  4. <a href="">我是超链接标签</a>
  5. </div>
  6. <script>
  7. var div = document.getElementsByTagName('div')[0];
  8. var p = document.getElementsByTagName('p')[0];
  9. var a = document.getElementsByTagName('a')[0];
  10. var h1 = document.getElementsByTagName('h1')[0];
  11. div.innerHTML = '123';
  12. div.innerHTML += '456';
  13. </script>

image.png
把div中的h1、p、a都覆盖了,innerHTML包含标签与标签属性

image.png

image.png
image.png

innerText

区别在于**innerText **加的是文本

image.png

综合应用demo

demo createElement appendChild

写法一:缺点性能不好

  1. <body>
  2. <ul id="list">
  3. </ul>
  4. </body>
  5. <script>
  6. var list = document.getElementById('list'),
  7. item,
  8. data = [
  9. {
  10. 'title':'天下乌贼',
  11. "area":'中国'
  12. },
  13. {
  14. 'title':'破风',
  15. "area":'中国'
  16. },
  17. {
  18. 'title':'湄公河行动',
  19. "area":'中国'
  20. },
  21. ]
  22. for(var i = 0; i<data.length;i++){
  23. item = data[i];
  24. var li = document.createElement('li'),
  25. h2 = document.createElement('h2'),
  26. p = document.createElement('p');
  27. h2.innerHTML = '电影名称 ' + item.title;
  28. p.innerHTML = '地区: '+ item.area;
  29. li.appendChild(h2);
  30. li.appendChild(p);
  31. list.appendChild(li);
  32. }
  33. </script>

写法二:dom结构复杂时不适合

  1. var list = document.getElementById('list'),
  2. item,
  3. data = [
  4. {
  5. 'title':'天下乌贼',
  6. "area":'中国'
  7. },
  8. {
  9. 'title':'破风',
  10. "area":'中国'
  11. },
  12. {
  13. 'title':'湄公河行动',
  14. "area":'中国'
  15. },
  16. ]
  17. for(var i = 0; i<data.length;i++){
  18. item = data[i];
  19. list.innerHTML += '<li>'+
  20. '<h3>电影名称:'+item.title+'</h3>'+
  21. '<p>地区:'+item.area+'</p>'+
  22. '</li>';
  23. }

image.png

image.png
image.png
image.png

demo2 innerHTML setAttribute

image.png

  1. <style>
  2. .running{
  3. color: green;
  4. }
  5. .warning{
  6. color: yellow;
  7. }
  8. .danger{
  9. color: tomato;
  10. }
  11. </style>
  12. </head>
  13. <body>
  14. <div class="running">
  15. 系统正常运行中
  16. </div>
  17. </body>
  18. <script>
  19. var div = document.getElementsByTagName('div')[0];
  20. function setSystemStatus(status) {
  21. div.setAttribute('class',status);
  22. switch(status){
  23. case 'running':
  24. div.innerHTML = '系统正常运行中';
  25. break;
  26. case 'warning':
  27. div.innerHTML = '系统中有警告';
  28. break;
  29. case 'danger':
  30. div.innerHTML = '系统存在危险';
  31. break;
  32. default:
  33. div.innerHTML = '系统处于未知状况';
  34. }
  35. }
  36. </script>

4.节点的修改替换 replaceChild()

replaceChild(new,origin)
image.png

自定义属性 data-*

获取data-*

dataset.data

demo

  1. <body>
  2. <a href="javascrpit:;" data-uri="txwz" data-sort="free">天下无贼</a>
  3. <a href="javascrpit:;" data-uri="fczlm" data-sort="pay">复仇者联盟</a>
  4. <a href="javascrpit:;" data-uri="olbbg" data-sort="free">欧罗巴报告</a>
  5. <a href="javascrpit:;" data-uri="plmxs" data-sort="pay">普罗米修斯</a>
  6. </body>
  7. <script>
  8. var links = document.getElementsByTagName('a');
  9. for(var i = 0;i<links.length;i++){
  10. (function(j) {
  11. links[j].onclick = function(){
  12. var sort = this.dataset.sort;
  13. var uri = this.dataset.uri;
  14. if(sort==='free'){ // data-sort === free跳转
  15. window.open('https://developer.mozilla.org/zh-CN/docs/Web/API/HTMLOrForeignElement/dataset');
  16. }else{ 不跳转
  17. console.log('这是付费影片');
  18. }
  19. }
  20. })(i)
  21. }
  22. </script>

image.png

文档碎片createDocumentFragment()

[DocumentFragments](https://developer.mozilla.org/en-US/docs/Web/API/DocumentFragment) 是DOM节点。它们不是主DOM树的一部分。通常的用例是创建文档片段,将元素附加到文档片段,然后将文档片段附加到DOM树。在DOM树中,文档片段被其所有的子元素所代替。
因为文档片段存在于内存中,并不在DOM树中,所以将子元素插入到文档片段时不会引起页面回流(对元素位置和几何上的计算)。因此,使用文档片段通常会带来更好的性能。

  1. <body>
  2. <ul id="list">
  3. </ul>
  4. </body>
  5. <script>
  6. var oUl = document.getElementById('list');
  7. var oFrag = document.createDocumentFragment();
  8. for(var i = 0;i<10000;i++){
  9. var oLi = document.createElement('li');
  10. oLi.innerHTML = i + '、这是第'+i+'个项目';
  11. oLi.className = 'list-item';
  12. oFrag.appendChild(oLi);
  13. }
  14. oUl.appendChild(oFrag);

image.png

课后作业

封装inserAfter方法

function(target,afterNode) target 需插入的元素 afterNode 指定要在哪个元素前插入
1) 寻找要追加的元素的下一个元素 nextElem = afterNode.nextElementSibling
2)如果有 则在下一个元素前插入一个元素 this.insertBefore(target,afterNode)
3) 如果没有 则是最后一个元素 则追加 插入 this.appendChild(target);

  1. <body>
  2. <div>
  3. <p></p>
  4. <h1></h1>
  5. <a href=""></a>
  6. </div>
  7. </body>
  8. <script>
  9. var div = document.getElementsByTagName('div')[0];
  10. var h1 = document.getElementsByTagName('h1')[0];
  11. var oStrong = document.createElement('strong');
  12. Element.prototype.insertAfter = function(target,afterNode){
  13. var nextElem = afterNode.nextElementSibling;
  14. if(nextElem){
  15. this.insertBefore(target,nextElem);
  16. }else{
  17. this.appendChild(target);
  18. }
  19. }
  20. </script>

其余作业未写