使用insertBefore实现insertAdjacentHTML()
Element.insertAdjacentHTML()方法由IE引入,并在HTML5中标准化,它将任意的HTML标记字符串插入到指定的元素“相邻”的位置。
insertAdjacentHTML()有两个参数,第一个参数为位置属性,第二个参数为待插入的标记字符串。且第一个参数为具有以下值之一的字符串:“beforebegin”、"afterbegin"、"beforeend"、"afterend",这些值插入点为:
(beforebegin) <div id="target"> (afterbegin) This is the element content (beforeend) </div> (afterend)
插入节点的为Node的方法appendChild()或insertBefore()。
- appendChild()方法是在需要插入的Element节点上调用的,它插入指定的节点使用其成为那个节点的最后一个节点。
- insertBefore()方法是新节点的父节点上调用并接受两个参数。第一个参数是待插入的节点,第二个参数是已存在的节点,新节点将插入到该节点的前面。如果第二个参数为null,其行为和appendChild()一样。
DocumentFragment是一种特殊的Node,它作为其他节点的一个临时的容器。
注意documentFrament的parentNode总是为null。如果给appendChild()、insertBefore()、replaceChild()传递一个DocumentFragment,其实是将该文档片段的所有子节点插入到文档中,而非片段本身。
为了使insertAdjacentHTML()方法兼容所有浏览器,并给它定义了一组更符合逻辑的名字,使用insertBefore()实现Insert.before(),Insert.after(),Insert.atAfter(),Insert.atEnd()方法。代码如下:
var Insert=(function(){
//如果元素有原生的insertAdjacentHTML,
//在4个函数名了的HTML插入函数中直接使用
if(document.createElement("div").insertAdjacentHTML){
return {
before:function(e,h){e.insertAdjacentHTML("beforebegin",h);},
after:function(e,h){e.insertAdjacentHTML("afterend",h);},
atStart:function(e,h){e.insertAdjacentHTML("beforebegin",h);},
atEnd:function(e,h){e.insertAdjacentHTML("afterend",h);}
};
}
//浏览不支持insertAdjacentHTML则通过insertBefor来实现
function fragment(html){
var elt=document.createElement("div"); //创建空文档
var frag=document.createDocumentFragment(); //创建空文档片段
elt.innerHTML=html; //设置文档内容
while(elt.firstChild) //移动所有的节点
frag.appendChild(elt.firstChild);
return frag;
}
var Insert={
before:function(elt,html){
elt.parentNode.insertBefore(frament(html),elt);
},
after:function(elt,html){
elt.parentNode.insertBefore(fragment(html),elt.nextSibling);
},
atStart:function(elt,html){
elt.insertBefore(fragment(html),elt.firstChild);
},
atEnd:function(elt,html){
elt.insertBefore(fragment(html));
//insertBefore第二参数为null时,其行为类似于appendHTML(),它将节点插入到最后。
}
}
Element.prototype.insertAdjacentHTML=function(pos,html){
switch(pos.toLowerCase()){
case "beforebegin":return Insert.before(this,html);
case "afterend":return Insert.after(this,html);
case "afterbegin":return Insert.atStart(this,html);
case "beforeend":return Insert.atEnd(this,html);
}
}
return Insert;
}());
引自《JavaScript权威指南》 15.6
使用insertBefore实现insertAdjacentHTML()的更多相关文章
- Smashing The Browser:From Vulnerability Discovery To Exploit学习记录
浏览器Fuzz技术 漏洞挖掘 白盒挖掘 代码审计 自动化代码分析 黑盒挖掘 Fuzzing 两种Fuzzing技术 静态Fuzzing 基于变异的 文件.文档 多媒体 bf3 基于生成的 浏览器 重点 ...
- JavaScript插入节点小结
JS原生API插入节点的方式大致有innerHTML.outerHTML.appendChild.insertBefore.insertAdjacentHTML.applyElement这6种. 这里 ...
- (转)DOM appendHTML实现及insertAdjacentHTML
appenChild() 原文转自 JS中有很多基本DOM方法,例如createElement, parentNode等,其中,appendChild方法是相当地常用与熟知,可谓是DOM节点方法中的& ...
- JS代码片段:appendHTML 和 insertAdjacentHTML
function appendHTML(container,html,position){ position =position || 'after'; var objE = document.cre ...
- 小tip: DOM appendHTML实现及insertAdjacentHTML
一.无人不识君 据说今天是邓丽君奶奶会见马克思的日子,所谓“无人不识君”就多了份“无人不识邓丽君”之意. JS中有很多基本DOM方法,例如createElement, parentNode等,其中,a ...
- innerHTML,outerHTML,innerText,outerText区别以及insertAdjacentHTML()方法
在需要给文档插入大量的新的HTML标记的情况下,通过多次DOM操作先创建节点再指定它们之间的关系会非常麻烦而且效率不高,相对而言插入标记的方法会更加简单,速度也更快. 插入标记中有这四个属性inner ...
- mui,css3 querySelector,appendChild,style.display,insertBefore
<script> mui.init({ swipeBack:true //启用右滑关闭功能 }); window.addEventListener('toggle', function(e ...
- 【笔记】js parentsNode,lastChild,appendChild,insertBefore,nextSibling的意义及运用
这几天看书看到这几个属性做几个笔记 parentNode:顾名思义,就是获取某元素的父元素等同于jq的parent(). *注意一下,在调用parentNode 方法的时候 调用的对象必须是用ID 或 ...
- (转)appendChild()、insertBefore()是移动element节点!
原文地址 appendChild().insertBefore()是移动element节点,看书的时候注意过,也可以做一个简单的例子测试一下: <div id="div1"& ...
随机推荐
- celery使用的一些小坑和技巧(非从无到有的过程)
纯粹是记录一下自己在刚开始使用的时候遇到的一些坑,以及自己是怎样通过配合redis来解决问题的.文章分为三个部分,一是怎样跑起来,并且怎样监控相关的队列和任务:二是遇到的几个坑:三是给一些自己配合re ...
- RabbitMQ + PHP (一)入门与安装
RabbitMQ: 1.是实现AMQP(高级消息队列协议)的消息中间件的一种. 2.主要是为了实现系统之间的双向解耦而实现的.当生产者大量产生数据时,消费者无法快速消费,那么需要一个中间层.保存这个数 ...
- maven的pom.xml关系依赖书写顺序
今天遇到了一个情况,以前代码编译没有问题,升级了hbase客户端phoenix驱动,又调整了thrift的关系依赖的位置,放到了这个驱动后面. 如下: 导致了一个thrift接口类编译报错: 检查这个 ...
- MySQL: Fabric 搭建 HA
搭建好Fabric之后,就可以在它的基础上创建HA Group. Shard Group.HA+Shard Group等.这里来说明一下如何快速的搭建HA环境. Fabric 192.168.2.23 ...
- Firebug中调试中的js脚本中中文内容显示为乱码
Firebug中调试中的js脚本中中文内容显示为乱码 设置 页面 UFT-8 编码没用, 解决方法:点击 "Firebug"工具栏 中的"选项"---" ...
- MMORPG大型游戏设计与开发(攻击区域 扇形)
距离上次发布已经有了很长一段时间,期间由于各种原因没有更新这方面的技术分享,在这里深表遗憾.在MMO或其他的游戏中,会有针对各种形状的计算,通常在攻击区域里不会很复杂,常见的为矩形.圆形.扇形.今天分 ...
- 如何使用RobotFramework编写好的测试用例
如何使用Robot Framework编写优秀的测试用例 概述 命名 测试套件命名 测试用例命名 关键字命名 setup和teardown的命名 文档 测试套件文档 测试用例文档 用户关键字文档 测试 ...
- 【腾讯优测干货分享】如何降低App的待机内存(四)——进阶:内存原理
本文来自于腾讯优测公众号(wxutest),未经作者同意,请勿转载,原文地址:http://mp.weixin.qq.com/s/3FTPFvZRqyAQnU047kmWJQ 1.4进阶:内存原理 在 ...
- (译)你应该知道的jQuery技巧
帮助提高你jQuery应用的简单小技巧. 回到顶部按钮 图片预加载 判断图片是否加载完 自动修补破损图像 Hover切换class类 禁用输入 停止正在加载的链接 toggle fade/slide ...
- SQL优化案例—— RowNumber分页
将业务语句翻译成SQL语句不仅是一门技术,还是一门艺术. 下面拿我们程序开发工程师最常用的ROW_NUMBER()分页作为一个典型案例来说明. 先来看看我们最常见的分页的样子: WITH CTE AS ...