JavaScript DOM基本操作 增插入删替换
之前的一些列操作全都是查看操作,全是查找元素的怎么把这个元素找出来,下面的这些是另几个操作增、插、删、替换
DOM基本操作:
增
document.createElement();
document.createTextNode();
document.createComment();
document.createDocumentFragment();
插(剪切操作)
PARENTNODE.appendChild();
PARENTNODE.insertBefore(a, b);
删
parent.removeChild();
child.remove();
替换
parent.replaceChild(new, origin);
一、增
能不能凭空创造一个元素节点呢?
完全可以,别说是元素节点,节点都是可以创造的,比如文本节点可以创造、元素节点可以创造、就连注释节点都可以创造。
document.createElement()
增加或创建一个元素节点,写 p 就创建 <p> 标签、写 strong 就创建 <strong> 标签
通过 js 的方式创建一个 div 标签,并且返回到变量 box 里面去
var box = document.createElement('div'); console.log(box); // <div></div>
然而这个 div 标签 js 拿着,给它加了点属性
var box = document.createElement('div'); box.innerHTML = '123'; // 加属性 console.log(box); // "<div>123</div>"
body 调用 appendChild() 方法把创建的 div 放到页面里面
1. appendChild() 插入页面的方法
2. document.body 是 body 标签
var box = document.createElement('div'); box.innerHTML = '123'; document.body.appendChild(box);
此时再给这个 div 加上一些修改,页面上的 div 也会发生改变
var box = document.createElement('div'); box.innerHTML = '123'; document.body.appendChild(box); box.innerHTML = '给时光以生命,给岁月以文明';
document.createTextNode() 创建文本节点
var text = document.createTextNode('给时光以生命,给岁月以文明。'); // 创建文本节点 document.body.appendChild(text); // 插入到页面
document.createComment() 第三个创建注释节点
var comment = document.createComment('this is comment'); document.body.appendChild(comment);
document.createDocumentFragment() 还有一个创建文档碎片节点
文档碎片是最后一节课的知识,现在涉及不到,
单独的创建没什么用要配合插入操作。
二、插(剪切操作)
appendChild()
任何一个元素节点都有 appendChild 方法,可以直接理解成 push,在数组的最后一位插入新东西,appendChild 方法基本上是一个意思
<div></div> <script> var oDiv = document.getElementsByTagName('div')[0]; // 选中div var text = document.createTextNode('给时光以生命,给岁月以文明'); // 创建一个文本节点 oDiv.appendChild(text); // div调用appendChild方法把text放进去 </script>
<div>给时光以生命,给岁月以文明</div>
创建一个 span 标签插入到 div 里面,
span 出现在文字“给时光以生命,给岁月以文明”后面,因为 appendChlid 类似于数组的 push
<div></div> <script> var oDiv = document.getElementsByTagName('div')[0]; var text = document.createTextNode('给时光以生命,给岁月以文明'); oDiv.appendChild(text); var span = document.createElement('span'); // 再创建的span标签 oDiv.appendChild(span); // 把span标签插入到div里面 </script>
<div>
给时光以生命,给岁月以文明
<span></span>
</div>
把已经在页面 div 里的“给时光以生命,给岁月以文明”,插入到 span 元素里面去
<div></div> <script> var oDiv = document.getElementsByTagName('div')[0]; var text = document.createTextNode('给时光以生命,给岁月以文明'); oDiv.appendChild(text); var span = document.createElement('span'); oDiv.appendChild(span); span.appendChild(text); // 文本'给时光以生命,给岁月以文明'再插入到span标签 </script>
把一个页面里已有的部分 appendChild 到另一个部分就是剪切了,
之前 div 里面的文本到 span 里面了,说明 appendChild 是一种剪切操作
<div>
<span>
给时光以生命,给岁月以文明
</span>
</div>
下面看一个更直观的,
div 调用 appendChild() 方法把 span 放到 div 里面去
<div></div> <span></span> <script> var oDiv = document.getElementsByTagName('div')[0]; var oSpan = document.getElementsByTagName('span')[0]; oDiv.appendChild(oSpan); // 把span插入到div里面 </script>
div 和 span本来是兄弟结构,现在 span 放到 div 里面去了,再次说明 appendChild() 是剪切操作
<div>
<span></span>
</div>
insertBefore()
语法是 parentNode.insertBefore(a, b) 一定要父级调用,往父级的里面去插入元素
div.insertBefore(a, b) 一定要分开读
1. div insert a
2. before b
在 div 内插入一个 a 元素,
a 元素的位置再 b 元素之前
<div> <span></span> </div> <script> var oDiv = document.getElementsByTagName('div')[0]; // 父元素div var oSpan = document.getElementsByTagName('span')[0]; // 子元素span var strong = document.createElement('strong'); // 创建元素strong oDiv.insertBefore(strong, oSpan); // 把strong插入到div里面,strong的位置在span之前插入 </script>
strong 在 span 之前被插入
<div>
<strong></strong>
<span></span>
</div>
三、删
删除节点有两种删法
第一种谋杀,父节点删除自己的子节点
第二种自杀,节点自己调用一个方法自尽,自己就消失了
parent.removeChild()
父节点调用一个方法,父级就会把 child 移除 remove 掉
<div> <i>i</i> <strong>strong</strong> <span>span</span> </div> <script> var oDiv = document.getElementsByTagName('div')[0]; var i = document.getElementsByTagName('i')[0]; console.log(oDiv.removeChild(i)); // <i></i> </script>
控制台返回结果 <i></i>,其实是把这个i标签给剪切出来了
页面里面就没有 i 标签了
<div>
<strong></strong>
<span>span</span>
</div>
i.remove()
<i> 标签自杀式删除
var i = document.getElementsByTagName('i')[0]; i.remove();
remove() 什么都没有返回,真的就是销毁了,remove() 是 es5 里的新方法原来没有,原来只有 removeChlid(),
如果我们想把这个标签剪切出来留着,以后可能还会用那就 removeChlid(),如果觉得没什么用想删除就直接 remove()
四、替换
替换方法上镜率不高但是确实是有
parent.replaceChild(new, origin) 替换还是父级调用
意思是拿新的元素去替换老的元素
第一个参数是新的,后面的参数是老的
<div> <span>span</span> </div> <script> var oDiv = document.getElementsByTagName('div')[0]; var OSpan = document.getElementsByTagName('span')[0]; var strong = document.createElement('strong'); var i = document.createElement('i'); oDiv.insertBefore(strong, OSpan); oDiv.insertBefore(i, strong); var p = document.createElement('p'); // 创建一个p标签 oDiv.replaceChild(p, strong); // 第一个参数放新创建的p标签,替换第二个参数strong。原来的 stong 被剪切出来了返回 <strong></strong> </script>
替换之前 div 里面是这样的结构
<div>
<i></i>
<strong></strong>
<span>span</span>
</div>
替换后 strong 的位置变成 p 了
<div>
<i>i</i>
<p></p>
<span>span</span>
</div>
自己做的练习,
上面 span 元素、strong 元素、i 元素是 js 生成的,下面直接用写的元素做替换操作
<div> <i>i</i> <strong>strong</strong> <span>span</span> </div> <script> var oDiv = document.getElementsByTagName('div')[0]; var oStrong = document.getElementsByTagName('strong')[0]; var p = document.createElement('p'); // 创建一个p标签 oDiv.replaceChild(p, oStrong); // 返回<strong></strong>,第一个参数放新的p标签替换strong </script>
上面这些都是基本的操作,说一下常用的重点
增 Document.createElement()
插 ParentNode.appendChild()
ParentNode.insertBefore(a, b)
删 ParentNode.removeChild()
Child.remove()
五、Element节点的一些属性(元素节点上的一些属性)
innerHTML
innerText(火狐不兼容)/textContent(老版本IE不好使)
innerHTML 能改变div里面的html内容
直接能获取 div 里面的 html 内容
<div> <span>123</span> <strong>456</strong> </div> <script> var div = document.getElementsByTagName('div')[0]; console.log(div.innerHTML); // div.innerHTML直接获取的是div里面的html内容 </script>
把 div 里面的 html 内容取出来了
inneHTML 还可以往 div 里面写入,写入的是追加还是覆盖呢?
<div> <span>123</span> <strong>456</strong> </div> <script> var div = document.getElementsByTagName('div')[0]; div.innerHTML = '123'; // 写入123是追加还是覆盖呢? console.log(div); // 是覆盖,自此之后div里只有"123" </script>
原内容被覆盖了,只有追加的"123"
如果想在 "123" 后面追加 "456" 怎么办?
<div> <span>123</span> <strong>456</strong> </div> <script> var div = document.getElementsByTagName('div')[0]; div.innerHTML = '123'; div.innerHTML += '456' // "加等于"的意思是innerHTML先取值然后加上"456"再赋回去 console.log(div); // <div>123456</div> </script>
能执行加等于操作的都是可赋值可取值的,可写可读的才能加等于
innerHTML 改变一个元素里面的 html 内容
<div> <span>123</span> <strong>456</strong> </div> <script> var div = document.getElementsByTagName('div')[0]; div.innerHTML = "<span style='background-color:red;color:#fff;font-size:20px;'>123</span>"; </script>
结果是这样的
<div><span style="background-color:red;color:#fff;font-size:20px;">123</span></div>
Element.innerHTML
ele.innerHTML 不论是写的还是取的全都是 html 结构,往里写 html 结构 html 就会识别的
能赋、能取,innerHTML 用的几率是比较多的
innerText
可以取和写文本内容
取值
innerText 不会管标签,直接把文本内容取出来
<div> <span>123</span> <strong>456</strong> </div> <script> var div = document.getElementsByTagName('div')[0]; console.log(div.innerText); // 返回"123 456",innerText不会管标签,直接把文本内容取出来 </script>
赋值
把原来所有的东西全覆盖了
<div> <span>123</span> <strong>456</strong> </div> <script> var div = document.getElementsByTagName('div')[0]; div.innerText = 'abc'; // 把原来所有的东西全覆盖了 "<div>abc</div>" </script>
innerText 在赋值的时候一点要小心,
如果 div 里面还有其它结构的话,不要赋值,会把结构全覆盖掉,如果结构里只是文本想改文本可以赋值
有一个小的注意点,
innerText 方法火狐是没有的,火狐里面支持一个方法和 innerText 效果是一样的叫 textContent
<div> <span>123</span> <strong>456</strong> </div> <script> var div = document.getElementsByTagName('div')[0]; console.log(div.textContent); // 先取值返回"123 456" div.textContent= '火狐'; // <div>火狐</div> </script>
但是 textContent 方法老版本 IE 没有,
现在不用关心那么多知道这个兼容性就行,用的时候一般用 innerText 就好,innerHTML 现在火狐兼容的很好,不兼容也是老版本不兼容,距离现在很遥远之前的版本了
三、Element节点的一些方法(元素节点上的一些属性)
ele.setAttribute()
ele.getAttribute()
元素(Element)节点上的两个方法
setAttribute()
getAttribute()
设置一个行间属性就用 setAttribute( 属性名, 属性值 ) 方法,前面是属性名后面是属性值
给 div 上面设置了一个 class="demo" 属性
<div> <span>123</span> <strong>456</strong> </div> <script> var div = document.getElementsByTagName('div')[0]; div.setAttribute('class' ,'demo'); console.log(div); // <div class="demo">…</div> </script>
比如给 div 加一个 id,也可以通过 js 动态操作
<div> <span>123</span> <strong>456</strong> </div> <script> var div = document.getElementsByTagName('div')[0]; div.setAttribute('class' ,'demo'); div.setAttribute('id', 'only'); // 加一个id属性 console.log(div); // <div class="demo" id="only"></div> </script>
getAttribute() 取行间属性的值
取 id 值只填一个参数就行了
<div> <span>123</span> <strong>456</strong> </div> <script> var div = document.getElementsByTagName('div')[0]; div.setAttribute('class' ,'demo'); div.setAttribute('id', 'only'); console.log(div.getAttribute('id')); // "only" </script>
可以来一个动态的操作,
div 什么属性都没有,css 样式表里面已经设置好了 #lonly,然后通过 js 动态的给 div 加 id
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>setAttribute</title> <style> #only{ font-size: 20px; color:#fff; background-color:orange; } </style> </head> <body> <div>123</div> <script> var div = document.getElementsByTagName('div')[0]; div.setAttribute('id', 'only'); </script> </body> </html>
还可以当满足一定条件的时候 if... 再触发 setAttribute 语句加属性,就可以变成一个动态交互效果了
实际工作中自定义属性的例子,
行间的属性可以设置系统没有的属性
A 标签后面有一个 data-log = 0,往下还是 A 标签 data-log = 1,
下面每一个 A 标签都会有一个 data-log 这是什么意思呢?
data-log 是一个打点的意思,在公司开放的时候要统计每一个可以点击的区域,用户的点击率是多少怎么统计呢?
当我们去点击一区域的时候(区域代表一个元素)上面会有一个唯一的标识叫 data-log,点击这个元素的时候,程序会索取这个 data-log 唯一标识把它发送到服务器,然后服务器来统计接受了多个0多少个1…来代表当前区域被点击了多少次,
然而这个 data-log 是人工定义的一个属性它没有任何意思,这个属性只是为了储存唯一标识的数据
下面看怎么来设置 data-log 的值,用 getAttribute() 取行间样式的属性值
<a href="#" data-log="0">Glee</a> <script> var a = document.getElementsByTagName('a')[0]; a.onclick = function(){ console.log(this.getAttribute('data-log')); // 0 } </script>
点击两次A标签出现两个0,然后ajax往服务器上发送就行了
小例子
让下面三个标签的行间有一个 this-name 属性,属性值是 nodeName
<div>祝祖国</div> <span>国泰</span> <strong>民安</strong> <script> var oAll = document.getElementsByTagName('*'); // 把三个属性都取出来 for(var i = 0; i < oAll.length; i++){ oAll[i].setAttribute('this-name', oAll[i].nodeName); } </script>
都有我们设置的 this-name 属性
课堂练习
请编写一段 JavaScript 脚本,生成下面这段 DOM 结构,
要求,使用标准的 DOM 方法或属性
提示,dom.className 可以写 class,建议用 setAttribute()
<div class="example"> <p class="slogan">中国伟大</p> <strong>复兴</strong> </div>
先生成 div、p、strong 三个标签,再一层层插入
var div = document.createElement('div'); var p = document.createElement('p'); var strong = document.createElement('strong'); div.setAttribute('class', 'example'); // 给div标签加属性 <div class="example"></div> p.setAttribute('class', 'slogan'); // 给p标签加属性 <p class="slogan"></p> var text1 = document.createTextNode('中国伟大'); // 创建文本节点 var text2 = document.createTextNode('复兴'); // 创建文本节点 p.appendChild(text1); // 把文本节点'中国伟大'插入到p标签 strong.appendChild(text2); // 把文本节点'复兴'插入到strong标签 div.appendChild(p); // p标签插入到div div.appendChild(strong); // strong标签插入到div document.body.appendChild(div); // 把div标签插入到页面
还有简便的方法,不按套路出牌直接创建一个 div 直接在里面写结构也行
var div = document.createElement('div'); div.setAttribute('class', 'example'); div.innerHTML = '<p class="slogan">中国伟大</p>\<strong>复兴</strong>'; document.body.appendChild(div);
改变行间样式 class 值有一个最简单的方法,提示 dom.className 可以读写 class
var div = document.createElement('div'); div.className = "Glee"; div.id = "lili"; // 改id也能改 console.log(div); // <div class="Glee" id="lili"></div>