insertAdjacentHTML()有两个参数,第一个参数为位置属性,第二个参数为待插入的标记字符串。且第一个参数为具备如下值之一的字符串:“beforebegin”、"afterbegin"、"beforeend"、"afterend",这些值插入点为:html
(beforebegin) <div id="target"> (afterbegin) This is the element content (beforeend) </div> (afterend)浏览器
注意documentFrament的parentNode老是为null。若是给appendChild()、insertBefore()、replaceChild()传递一个DocumentFragment,实际上是将该文档片断的全部子节点插入到文档中,而非片断自己。app
为了使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.6this