节点插入
对于早期的w3c浏览器,并没有实现ie的私有方法insertAdjacentHTML(目前已是HTML5标准),可以用appendChild模拟该方法的实现:
if(typeof HTMLElement !=='undefined' && !HTMLElement.prototype.insertAdjacentHTML){
var insertAdjacentElement = function(node,position,el){
switch (position.toLowerCase()){
case 'beforebegin':
node.parentNode.insertBefore(el,node);
break;
case 'afterbegin':
node.insertBefore(el,node.firstChild);
break;
case 'beforeend':
node.appendChild(el);
break;
case 'afterend':
if(node.nextSibling){
node.parentNode.insertBefore(el,node.nextSibling);
}else{
node.parentNode.appendChild(el);
}
break;
}
};
HTMLElement.prototype.insertAdjacentHTML = function(position,html){
var range = document.createRange(),frag,
parent;
range.setStart(document.body);
frag = range.createContextualFragment(html);
if(this.nodeType == 3 || this.nodeType == 8){
parent = this.parentNode;
insertAdjacentElement(parent,position,frag);
}else{
insertAdjacentElement(this,position,frag);
}
}
}
使用了Range.createContextualFragment(html)方法,MDN对该方法叙述:The Range.createContextualFragment()
method returns a DocumentFragment
by invoking the HTML fragment parsing algorithm or the XML fragment parsing algorithm with the start of the range (the parent of the
selected node) as the context node. The HTML fragment parsing algorithm is used if the range belongs to a Document
whose HTMLness bit
is set. In the HTML case, if the context node would be html
, for historical reasons the fragment parsing algorithm is invoked with body
as the context instead. 也就是说,选中节点的父节点(即Range对象的startContainer属性)为HTML(XML)文档片段解析算法的上下文节点。
该方法兼容Chrome,Firefox,IE11,以及Opera15.对于模拟insertAdjacentHTML足够用。当然也可使用兼容性没有问题的DocumentFragment对象。
但是出于好奇,我用了jsperf对插入节点的各个方法进行性能分析,发现依旧是appendChild的插入方法效率最高(指的是单位时间内的操作数)。
另外,对于innerHTML插入的易用性是不言而喻的,通常我们用一系列拼接的字符串给innerHTML赋值,此时会调用js解析器,将解析的相关节点
作为该元素的子节点。这个属性兼容性没有问题。相应的也有outerHTML属性,这个兼容性也没有多大问题,除非你是用的是Firefox 11之前的版本。
对于outerHTML可以用innerHTML做一些兼容性。
1 //对Firefox 11- 版本做兼容,其不支持outerHTML属性
2 function getOuterHtml(){
3 var e = document.createElement("div");
4 e.appendChild(this);
5 return e.innerHTML;
6 }
7 function setOuterHtml(){
8 var e = document.createElement("div");
9 var p = this.parentNode;
10 e.appendChild(this);
11 while(e.firstChild){
12 p.insertBefore(e.firstChild,this);
13 }
14 p.removeChild(this);
15 }
16
17 if(Object.defineProperty){
18 Object.defineProperty(Element.prototype,"outerHTML",{
19 get: getOuterHtml,
20 set: setOuterHtml,
21 enumerable: false,
22 configurable: false
23 })
24 }else{
25 Element.prototype.__defineGetter__("outerHTML",getOuterHtml);
26 Element.prototype.__defineSetter__("outerHTML",setOuterHtml);
27 }
- Mapxtreme之活活气死
- 仿淘宝的交易到计时JS
- 继小程序之后“小游戏”也来了,微信为此再次开启神秘入口
- (Head First 设计模式)学习笔记(3) --装饰者模式(StarBuzz咖啡店实例)
- 我的Js代码-按钮按下时判断是否选择了最后一行,给出提示
- (Head First 设计模式)学习笔记(2) --观察者模式(气象站实例)
- Spring Boot使用HandlerInterceptorAdapter和WebMvcConfigurerAdapter实现原始的登录验证
- 一条视频获C+融资 两个域名神助攻
- ExtJs与WCF交互:生成树
- JavaScript大略
- 加点的心得
- Markdown
- 介绍linux下利用编译bash设置root账号共用的权限审计设置
- 分享一例脚本发版和tomcat重启脚本
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Android利用RecyclerView编写聊天界面
- 5行代码实现微信消息推送,springboot实现微信推送,java微信推送
- Android控件ListView使用方法详解
- android ContentResolver获取手机电话号码和短信内容
- 借助云开发实现小程序列表页(包含json数据的请求和解析)
- Android shape 绘制图形的实例详解
- 微信小程序实现时间轴和地区列表的功能
- Android ListView的Item点击效果的定制
- Android Application存取公共数据的实例详解
- Android Handler的详解及实例
- Android 通过Intent调用系统拍照程序出现图片太小的问题解决办法
- Android Bitmap压缩方式分析
- Android自定义View实现游戏摇杆键盘的方法示例
- 详解Android Libgdx中ScrollPane和Actor事件冲突问题的解决办法
- Android ImageView的selector效果实例详解