[js高手之路] dom常用API【appendChild,insertBefore,removeChild,replaceChild,cloneNode】详解与应用
本文主要讲解DOM常用的CURD操作,appendChild(往后追加节点),insertBefore(往前追加节点),removeChild(移除节点),replaceChild(替换节点),cloneNode(克隆节点)的语法与实战应用
一、appendChild: 向元素的内部最后面增加一个节点,或者移动一个现有的节点到元素的内部最后面
用法:
someNode.appendChild( newNode )
someNode通常为元素的父节点
返回值:
返回新增加的节点
<input type="text" name="" id="txt">
<input type="button" value="添加" id="add">
<ul id="box"></ul>
<script>
var oBtn = document.querySelector("#add");
var oTxt = document.querySelector("#txt");
var oBox = document.querySelector("#box");
oBtn.onclick = function () {
var oLi = document.createElement( "li" );
oLi.innerHTML = oTxt.value;
var returnNode = oBox.appendChild( oLi );
console.log( returnNode === oLi ); //true
console.log( returnNode === oBox.lastChild );//true
}
</script>
上例,把文本框的内容当做一个新节点,添加在id为box的元素的最后面,返回值returnNode就是新增加的节点,
所以 第12行和第13行的返回值为ture, lastChild表示元素的最后一个子节点
如果appendChild后面的参数是文档现有的节点,那么表示把当前节点移动到父元素的最后面
<input type="button" value="移动" id="btn">
<ul id="box">
<li><a href="javascript:;">王朝</a></li>
<li><a href="javascript:;">马汉</a></li>
<li><a href="javascript:;">张龙</a></li>
<li><a href="javascript:;">赵虎</a></li>
<li><a href="javascript:;">ghostwu</a></li>
</ul>
<script>
var oBtn = document.getElementById("btn");
var oBox = document.getElementById("box");
oBtn.onclick = function () {
var firstChild = oBox.firstElementChild || oBox.firstChild;
var lastChild = oBox.lastElementChild || oBox.lastChild;
var returnNode = oBox.appendChild( firstChild );
firstChild = oBox.firstElementChild || oBox.firstChild;
lastChild = oBox.lastElementChild || oBox.lastChild;
console.log( returnNode === firstChild ); //false
console.log( returnNode === lastChild ); //true
}
</script>
上例,每次点击按钮,把第一个节点移动到最后,所以在第18行为false, 因为移动之后,他就不是第一个节点了,而变成最后一个节点,所以第19行比较结果为true
二、insertBefore:向一个元素前面追加节点
用法:
someNode.insertBefore( newNode, referNode );
第一个参数: newNode,需要插入的节点
第二个参数: referNode, 参考节点,即:newNode会插入到这个参考节点的前面,
注意:如果第二个参数为null, 效果等同于someNode.appendChild( newNode )
返回值:
新插入的节点
<input type="text" id="txt">
<input type="button" value="添加" id="add">
<ul id="box"></ul>
<script>
var G = function ( id ){ return document.getElementById( id ) };
var GG = function ( id, tag ){ return G(id).getElementsByTagName(tag) };
var oTxt = G( "txt" ),
oBox = G( "box" ),
oAdd = G( "add" )
aLi = GG( 'box', 'li' );
oAdd.onclick = function(){
var oLi = document.createElement("li");
oLi.innerHTML = oTxt.value,
returnNode = null;
//等价于oBox.appendChild( oLi )
// oBox.insertBefore( oLi, null );
// oBox.appendChild( oLi );
if( aLi[0] ) {
returnNode = oBox.insertBefore( oLi, aLi[0] );
}else {
returnNode = oBox.insertBefore( oLi, null );
}
console.log( returnNode );
}
</script>
三、removeChild: 移除一个节点
someNode.removeChild( node )
someNode通常为父元素,node就是父元素下面的一个元素
返回值: 当前被移除的元素
<input type="text" name="" id="txt">
<input type="button" value="移除" id="remove">
<ul>
<li>1</li>
<li>2</li>
<li>3</li>
<li>4</li>
</ul>
<script>
var oRemove = document.querySelector( "#remove" );
var oUl = document.querySelector( "ul" );
oRemove.onclick = function(){
var n = parseInt( document.querySelector("#txt").value );
var returnNode = oUl.removeChild( oUl.children[n] );
console.log( returnNode );
}
</script>
上例,在输入框中, 输入需要移除的子节点的索引,即可完成移除节点操作.
四、replaceChild: 用新节点去替换已经存在的节点
用法
someNode.replaceChild( newNode, node )
第一个参数:新节点
第二个参数: 被替换的节点
返回值: 返回当前被替换的子节点
下例,有点小复杂,用了节点缓存(设计模式中的享元模式)提高替换节点的性能,虽然只有8个节点,如果是上万个节点,会有明显的提高.
<input type="button" value="替换" id="replace">
<br>
<span>第1个元素</span>
<span>第2个元素</span>
<span>第3个元素</span>
<span>第4个元素</span>
<span>第5个元素</span>
<span>第6个元素</span>
<span>第7个元素</span>
<span>第8个元素</span>
<script>
var oReplace = document.querySelector("#replace"),
aSpan = document.querySelectorAll("span"),
page = 0, //当前页
perPage = 4, //每次替换4个
total = Math.ceil(aSpan.length / perPage); //总页数 var cache = (function () {
var aEle = [];
var create = function () {
var oDiv = document.createElement("div");
aEle.push(oDiv);
return oDiv;
};
return {
getDiv: function () {
if (aEle.length < 4) {
console.log(1);
return create();
} else {
console.log(2);
var oDiv = aEle.shift();
aEle.push(oDiv);
return oDiv;
}
}
};
})();
var aCacheSpan = [];
oReplace.onclick = function () {
var oDiv = null;
page++;
if (page < 3) {
if (aCacheSpan.length > 0) {
var oBox = document.querySelector('div');
for (var i = 0, len = aCacheSpan.length; i < len; i++) {
document.body.insertBefore(aCacheSpan[i], oBox);
}
aCacheSpan = [];
}
for (var i = (page - 1) * perPage; i < (page - 1) * perPage + perPage; i++) {
console.log(aSpan[i].innerHTML);
oDiv = cache.getDiv();
oDiv.innerHTML = aSpan[i].innerHTML;
aCacheSpan.push(document.body.replaceChild(oDiv, aSpan[i]));
}
}
}
</script>
五、cloneNode: 复制一个节点
用法:
someNode.clone( bool值 )
参数有两种情况:
如果为true: 代表深拷贝: 即复制当前节点和他下面的所有子节点,如果存在行间事件,也会被复制
如果为false: 代表浅拷贝:即复制当前节点,不会复制他下面的子节点
返回值:返回当前被复制的元素
<input type="button" value="深拷贝" id="btn1">
<input type="button" value="浅拷贝" id="btn2">
<ul>
<li>1</li>
<li>2</li>
<li>3</li>
<li>4</li>
</ul>
<script>
var oBtn1 = document.querySelector("#btn1");
var oBtn2 = document.querySelector("#btn2");
var oUl = document.querySelector( "ul" );
oBtn1.onclick = function () {
var aNode = oUl.cloneNode( true );
console.log( aNode );
}
oBtn2.onclick = function () {
var aNode = oUl.cloneNode( false );
console.log( aNode );
}
</script>
[js高手之路] dom常用API【appendChild,insertBefore,removeChild,replaceChild,cloneNode】详解与应用的更多相关文章
- [js高手之路] dom常用节点属性兼容性详解与应用
一.每个DOM节点都有一个nodeType属性,表示节点类型, NodeType一共有12种类型,我们可以通过遍历内置的Node构造函数获取 window.onload = function(){ v ...
- [js高手之路] html5 canvas系列教程 - 掌握画直线图形的常用API
我们接着上文[js高手之路] html5 canvase系列教程 - 认识canvas以及基本使用方法继续. 一.直线的绘制 cxt.moveTo( x1, y1 ): 将画笔移动到x1, y1这个点 ...
- JS操作DOM常用API总结
<JS高程>中的DOM部分写的有些繁琐,还没勇气整理,直到看到了这篇博文 Javascript操作DOM常用API总结,顿时有了一种居高临下,一览全局的感觉.不过有时间还是得自己把书里面的 ...
- [js高手之路] html5 canvas动画教程 - 实时获取鼠标的当前坐标
有了前面的canvas基础之后,现在开始就精彩了,后面写的canvas教程都是属于综合应用,前面已经写了常用的canvas基础知识,参考链接如下: [js高手之路] html5 canvas系列教程 ...
- [js高手之路]设计模式系列课程-组合模式+寄生组合继承实战新闻列表
所谓组合模式,就是把一堆结构分解出来,组成在一起,现实中很多这样的例子,如: 1.肯德基套餐就是一种组合模式, 比如鸡腿堡套餐,一般是是由一个鸡腿堡,一包薯条,一杯可乐等组成的 2.组装的台式机同理, ...
- [js高手之路]Node.js+jade+mongodb+mongoose实现爬虫分离入库与生成静态文件
接着这篇文章[js高手之路]Node.js+jade抓取博客所有文章生成静态html文件继续,在这篇文章中实现了采集与静态文件的生成,在实际的采集项目中, 应该是先入库再选择性的生成静态文件.那么我选 ...
- [js高手之路] html5 canvas系列教程 - 图片操作(drawImage,clip,createPattern)
接着上文[js高手之路] html5 canvas系列教程 - 文本样式(strokeText,fillText,measureText,textAlign,textBaseline)继续,本文介绍的 ...
- 【repost】Javascript操作DOM常用API总结
Javascript操作DOM常用API总结 文本整理了javascript操作DOM的一些常用的api,根据其作用整理成为创建,修改,查询等多种类型的api,主要用于复习基础知识,加深对原生js的认 ...
- [js高手之路]深入浅出webpack教程系列6-插件使用之html-webpack-plugin配置(下)
上文我们对html-webpack-plugin的实例htmlWebpackPlugin进行了遍历分析,讲解了几个常用属性( inject, minify )以及自定义属性的添加,本文,我们继续深入他 ...
随机推荐
- 角点检测和匹配——Harris算子
一.基本概念 角点corner:可以将角点看做两个边缘的交叉处,在两个方向上都有较大的变化.具体可由下图中分辨出来: 兴趣点interest point:兴趣点是图像中能够较鲁棒的检测出来的点,它不仅 ...
- Python学习笔记——import模块
OS模块 直接输出系统命令到屏幕,该方法获取的命令返回值不可被赋值给变量,输出结果受编码影响会乱码: import os os.system("ipconfig") 将执行获取的系 ...
- Jenkins-FQA
1.svn url不能设置成文件路径,而应该是"文件夹"路径,也就是说必须是目录. 示例: Checking out https://svn.gw.com.cn:10000/svn ...
- java多线程系列(一)
java多线程技能 前言:本系列将从零开始讲解java多线程相关的技术,内容参考于<java多线程核心技术>与<java并发编程实战>等相关资料,希望站在巨人的肩膀上,再通过我 ...
- Spring Security @PreAuthorize 拦截无效
1. 在使用spring security的时候使用注解,@PreAuthorize("hasAnyRole('ROLE_Admin')") 放在对方法的访问权限进行控制失效,其中 ...
- 关于EF 通用增删改查的封装
1. Entity Framework是Microsoft的ORM框架,随着 Entity Framework 不断的完善强化已经到达了EF 6.0+ 还是非常的完善的,目前使用的比例相对于其他OR ...
- Java基础语法<九> 接口与内部类
1 接口 interface implement 接口的所有方法自动地属于public.因此,在接口中声明方法时,不必提供关键字public. 接口可以包含多个方法,接口中可以定义常量.接口中的 ...
- scroll事件实现监控滚动条并分页显示示例(zepto.js )
今天做了一个类似于手机端京东首页的页面,效果图如下: 刷新页面的时候,标题栏(也就是搜索栏),背景是透明的,当我们往下滑的时候,可以改变标题栏的背景透明度(渐变效果): 当标题栏滑过轮播图后,透明度就 ...
- Ambari安装之部署本地库(镜像服务器)(二)
部署本地库(镜像服务器) (1)下载HortWorks官网上的3个库到本地(也可以在线下载,但是速度会很慢) 我们先把hortworks官网上需要下载的3个库下载到本地(这个还是需要很长时间的,当然你 ...
- 处理文本,提取数据的脚本-主要就是用sed
处理文本,提取数据的脚本 #! /bin/sh | sed 's/)<\/small><\/td><td>/\n/g' # 用换行符替换 # 删除带有分号的行 # ...