...

var p = document.getElementById('p" />
当前位置:首页 > 日记 > 正文

JavaScript之DOM插入更新删除_动力节点Java学院整理

JavaScript之DOM插入更新删除_动力节点Java学院整理

JavaScript之DOM插入更新删除,供大家参考,具体内容如下

更新

拿到一个DOM节点后,我们可以对它进行更新。

可以直接修改节点的文本,方法有两种:

一种是修改innerHTML属性,这个方式非常强大,不但可以修改一个DOM节点的文本内容,还可以直接通过HTML片段修改DOM节点内部的子树:

// 获取<p id="p-id">...</p>var p = document.getElementById('p-id');// 设置文本为abc:p.innerHTML = 'ABC'; // <p id="p-id">ABC</p>// 设置HTML:p.innerHTML = 'ABC <span style="color:red">RED</span> XYZ';// <p>...</p>的内部结构已修改

innerHTML时要注意,是否需要写入HTML。如果写入的字符串是通过网络拿到了,要注意对字符编码来避免XSS攻击。
第二种是修改innerTexttextContent属性,这样可以自动对字符串进行HTML编码,保证无法设置任何HTML标签:

// 获取<p id="p-id">...</p>var p = document.getElementById('p-id');// 设置文本:p.innerText = '<script>alert("Hi")</script>';// HTML被自动编码,无法设置一个<script>节点:// <p id="p-id"><script>alert("Hi")</script></p>

两者的区别在于读取属性时,innerText不返回隐藏元素的文本,而textContent返回所有文本。另外注意IE<9不支持textContent
修改CSS也是经常需要的操作。DOM节点的style属性对应所有的CSS,可以直接获取或设置。因为CSS允许font-size这样的名称,但它并非JavaScript有效的属性名,所以需要在JavaScript中改写为驼峰式命名fontSize

// 获取<p id="p-id">...</p>var p = document.getElementById('p-id');// 设置CSS:p.style.color = '#ff0000';p.style.fontSize = '20px';p.style.paddingTop = '2em';

插入

当我们获得了某个DOM节点,想在这个DOM节点内插入新的DOM,应该如何做?
如果这个DOM节点是空的,例如,<div></div>,那么,直接使用innerHTML = '<span>child</span>'就可以修改DOM节点的内容,相当于“插入”了新的DOM节点。
如果这个DOM节点不是空的,那就不能这么做,因为innerHTML会直接替换掉原来的所有子节点。
有两个办法可以插入新的节点。一个是使用appendChild,把一个子节点添加到父节点的最后一个子节点。例如:

<!-- HTML结构 --><p id="js">JavaScript</p><div id="list">  <p id="java">Java</p>  <p id="python">Python</p>  <p id="scheme">Scheme</p></div>

<p id="js">JavaScript</p>添加到<div id="list">的最后一项:

var  js = document.getElementById('js'),  list = document.getElementById('list');list.appendChild(js);

现在,HTML结构变成了这样:

<!-- HTML结构 --><div id="list">  <p id="java">Java</p>  <p id="python">Python</p>  <p id="scheme">Scheme</p>  <p id="js">JavaScript</p></div>

因为我们插入的js节点已经存在于当前的文档树,因此这个节点首先会从原先的位置删除,再插入到新的位置。
更多的时候我们会从零创建一个新的节点,然后插入到指定位置:

var  list = document.getElementById('list'),  haskell = document.createElement('p');haskell.id = 'haskell';haskell.innerText = 'Haskell';list.appendChild(haskell);

这样我们就动态添加了一个新的节点:

<!-- HTML结构 --><div id="list">  <p id="java">Java</p>  <p id="python">Python</p>  <p id="scheme">Scheme</p>  <p id="haskell">Haskell</p></div>

动态创建一个节点然后添加到DOM树中,可以实现很多功能。举个例子,下面的代码动态创建了一个<style>节点,然后把它添加到<head>节点的末尾,这样就动态地给文档添加了新的CSS定义:

var d = document.createElement('style');d.setAttribute('type', 'text/css');d.innerHTML = 'p { color: red }';document.getElementsByTagName('head')[0].appendChild(d);

可以在Chrome的控制台执行上述代码,观察页面样式的变化。

insertBefore

如果我们要把子节点插入到指定的位置怎么办?可以使用parentElement.insertBefore(newElement, referenceElement);,子节点会插入到referenceElement之前。
还是以上面的HTML为例,假定我们要把Haskell插入到Python之前:

<!-- HTML结构 --><div id="list">  <p id="java">Java</p>  <p id="python">Python</p>  <p id="scheme">Scheme</p></div>

可以这么写:

var  list = document.getElementById('list'),  ref = document.getElementById('python'),  haskell = document.createElement('p');haskell.id = 'haskell';haskell.innerText = 'Haskell';list.insertBefore(haskell, ref);

新的HTML结构如下:

<!-- HTML结构 --><div id="list">  <p id="java">Java</p>  <p id="haskell">Haskell</p>  <p id="python">Python</p>  <p id="scheme">Scheme</p></div>

可见,使用insertBefore重点是要拿到一个“参考子节点”的引用。很多时候,需要循环一个父节点的所有子节点,可以通过迭代children属性实现:

var  i, c,  list = document.getElementById('list');for (i = 0; i < list.children.length; i++) {  c = list.children[i]; // 拿到第i个子节点}

删除

删除一个DOM节点就比插入要容易得多。
要删除一个节点,首先要获得该节点本身以及它的父节点,然后,调用父节点的removeChild把自己删掉:

// 拿到待删除节点:var self = document.getElementById('to-be-removed');// 拿到父节点:var parent = self.parentElement;// 删除:var removed = parent.removeChild(self);removed === self; // true

注意到删除后的节点虽然不在文档树中了,但其实它还在内存中,可以随时再次被添加到别的位置。
当你遍历一个父节点的子节点并进行删除操作时,要注意,children属性是一个只读属性,并且它在子节点变化时会实时更新。

例如,对于如下HTML结构:

<div id="parent">  <p>First</p>  <p>Second</p></div>

当我们用如下代码删除子节点时:

var parent = document.getElementById('parent');parent.removeChild(parent.children[0]);parent.removeChild(parent.children[1]); // <-- 浏览器报错

浏览器报错:parent.children[1]不是一个有效的节点。原因就在于,当<p>First</p>节点被删除后,parent.children的节点数量已经从2变为了1,索引[1]已经不存在了。

因此,删除多个节点时,要注意children属性时刻都在变化。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。

相关文章

ps怎样快速制作一个旋转空调按钮图

ps怎样快速制作一个旋转空调按钮图

空调,快速,按钮图标,电脑软件,ps,ps怎样快速制作一个旋转空调按钮图标?运用PHOTOSHOP软件,可以很简单的制作大家想要的照片,下面和小编一起来看看具体步骤吧。效果图:具体步骤:首先我们来分析一下。不管设计什么的时候,首先都要分析,不是拿着就开…

详谈javascript精度问题与调整

详谈javascript精度问题与调整

调整,精度问题,电脑软件,javascript,一个经典的问题:0.1+0.2==0.3答案是:false因为:0.1+0.2=0.30000000000000004第一次看到这个结果就是无比惊讶,下巴碰到地上,得深入了解下问题出在哪里,该怎么去调整。产生问题的原因在JS中数值类型就只有numbe…

VS2010/VS2013项目创建 ADO.NET连

VS2010/VS2013项目创建 ADO.NET连

项目创建,步骤,连接,详细,电脑软件,本随笔主要是对初学者通过ADO.NET连接数据库的步骤(刚开始我也诸多不顺,所以总结下,让初学者熟悉步骤)1、打开VS新建一个项目(这里的VS版本不限,建项目都是一样的步骤)VS2010版本如图:VS2013版本如图:2、非空项…

Angular动态添加、删除输入框并计

Angular动态添加、删除输入框并计

动态添加,删除,计算,输入框,实例代码,Angular动态添加、删除输入框并计算值实例代码摘要: 在学习群中交流时,有人分享了一个动态添加输入框的方法,我在其基础上进行了一些改进这个功能本身并不复杂,但还是要注意,每个ng-model的对象必须是不同…

怎么使用excel的复制公式excel的复

怎么使用excel的复制公式excel的复

方法,拖动,公式,使用方法,电脑软件,  Excel中公式的复制操作有其特殊性,对此小编从以下几个方面出发,给大家介绍一下在不同情况下公式的复制方法,希望对大家有所帮助。excel的复制公式使用方法一:直接复制公式法首先选中要复制公式的单元格或…

关于jQuery.ajax | 的jsonp碰上pos

关于jQuery.ajax | 的jsonp碰上pos

详解,电脑软件,ajax,jQuery,post,前言以前一直以为当$.ajax()的 dataType设置为jsonp时,其method(请求方法)无论怎么设置,都会变成get,直到前两天遇到了一个坑。下面来一起看看详细的介绍:关于跨域请求与jsonp 跨域:由于受到同源策略(协议、域名、…

excel中分列教程

excel中分列教程

教程,电脑软件,excel,  Excel中的分列功能具体该如何运用呢?下面是由小编分享的excel中分列教程,以供大家阅读和学习。excel中分列教程:  分列步骤1:启动Excel2003(其他版本请仿照操作),打开相应的工作表,在B列右侧插入一个空白列,用于保存分…

详解angularjs中如何实现控制器和

详解angularjs中如何实现控制器和

指令,交互,控制器,如何实现,详解,如果我们具有下面的DOM结构:<div ng-controller="MyCtrl"> <loader>滑动加载</loader> </div> 同时我们的控制器具有如下的签名:var myModule = angular.module("MyModule", []); //首先定义一个模块…

微信小程序 本地数据读取实例

微信小程序 本地数据读取实例

数据读取,实例,程序,电脑软件,微信小,微信小程序 本地数据读取实例一般情况下,小程序的utils这个文件夹下,我们可以把本地的数据写进去,封装成.js文件,提供对外暴露的接口,然后读取本地数据。如果涉及到一些针对这些数据的处理方法,也可以把方法…

ps怎么制作一个小李子的暗蓝色的个

ps怎么制作一个小李子的暗蓝色的个

李子,海报,蓝色,电脑软件,ps,我们看电影,都会看到很多海报,那些海报那么酷,那么帅,大部分是用PS调色出来的,下面来说说,PS6中怎么将一张图片P出海报效果。软件名称:Adobe Photoshop 8.0 中文完整绿色破解版软件大小:150.1MB更新时间:2015-11-041、首…

在Photoshop中如何创建图层蒙版呢?

在Photoshop中如何创建图层蒙版呢?

图层,电脑软件,Photoshop,蒙版呢,ps中蒙板工具可以让我们在不破坏素材的情况下完成对图层中图像的遮盖,而且还可以任意的再次进行修改,下面为大家介绍在Photoshop中如何创建图层蒙版方法,来体验一下吧。在Photoshop中如何创建图层蒙版第一步:若…

word2007如何借助查找和替换校正错

word2007如何借助查找和替换校正错

查找,替换,错别字,电脑软件,  在编写Word文档时,文字出现了很多错误字,如果一个一个去改,既麻烦又浪费时间,这时我们可以通过&ldquo;查找替换&rdquo;功能来纠正文中的错别字。那么下面就由小编给大家分享下word2007中借助查找和替换功能校正…