火狐控制台的html,Firefox outerHTML实现代码

减少DOM数可以加快浏览器的在解析页面过程中DOM Tree和render tree的构建,从而提高页面性能。为此我们可以把页面中那些首屏渲染不可见的部分HTML暂存在TextArea中,等完成渲染后再处理这部分HTML来达到这个目的。 要把TextArea 中暂存的HTML内容添加到页面中,使用元素的outerHTML属性是最简单方便的了,不过在DOM标准中并没有定义outerHTML,支持的浏览器有IE6+,safari, operal和 Chrome,经测试FF4.0- 中还不支持。所以我们就来实现一个可以跨浏览器的outerHTML。

outerHTML 就是获取或设置包含元素标签本身在内的html。下面是实现代码:

if(typeof HTMLElement !== "undefined" && !("outerHTML" in HTMLElement.prototype)) {

//console.log("defined outerHTML");

HTMLElement.prototype.__defineSetter__("outerHTML",function(str){

var fragment = document.createDocumentFragment();

var div = document.createElement("div");

div.innerHTML = str;

for(var i=0, n = div.childNodes.length; i

fragment.appendChild(div.childNodes[i]);

}

this.parentNode.replaceChild(fragment, this);

});

//

HTMLElement.prototype.__defineGetter__("outerHTML",function(){

var tag = this.tagName;

var attributes = this.attributes;

var attr = [];

//for(var name in attributes){//遍历原型链上成员

for(var i=0,n = attributes.length; i

if(attributes[i].specified){

attr.push(attributes[i].name + '="' + attributes[i].value + '"');

}

}

return ((!!this.innerHTML) ?

''+this.innerHTML+''+tag+'>' :

'');

});

}

代码说明:

1 代码中首先条件判断来监测浏览器是否支持outerHTML以避免覆盖浏览器原生的实现。

2 "__defineSetter__","__defineGetter__" 是firefox浏览器私有方面。分别定义当设置属性值和获取属性要执行的操作。

3 在"__defineSetter__" "outerHTML"中为了避免插入页面中元素过多导致频繁发生reflow影响性能。使用了文档碎片对象fragment来暂存需要插入页面中DOM元素。

4 在"__defineGetter__" "outerHTML" 中使用元素attributes属性来遍历给元素指定的属性。结合innerHTML返回了包含原属本身在内的html字符串。

测试代码:

outerHTML

This is paragraph with a list following it

  • Item 1
  • Item 2
  • Item 3
  • Item 4

if(typeof HTMLElement !== "undefined" && !("outerHTML" in HTMLElement.prototype)) {

console.log("defined outerHTML");

HTMLElement.prototype.__defineSetter__("outerHTML",function(str){

var fragment = document.createDocumentFragment();

var div = document.createElement("div");

div.innerHTML = str;

for(var i=0, n = div.childNodes.length; i

fragment.appendChild(div.childNodes[i]);

}

this.parentNode.replaceChild(fragment, this);

});

//

HTMLElement.prototype.__defineGetter__("outerHTML",function(){

var tag = this.tagName;

var attributes = this.attributes;

var attr = [];

//for(var name in attributes){//遍历原型链上成员

for(var i=0,n = attributes.length; i

if(attributes[i].specified){

attr.push(attributes[i].name + '="' + attributes[i].value + '"');

}

}

return ((!!this.innerHTML) ?

''+this.innerHTML+''+tag+'>' :

'');

});

}

var content = document.getElementById("content");

alert(content.outerHTML)

假设要获取

sdfdsdfsd

的 P的outerHTML

代码:

var _p = document.getElementById('outerID');

_P = _P.cloneNode();

var _DIV = document.createElement();

_DIV.appendChild(_P);

alert(_DIV.innerHTML); 就是P的outerHTML;

firefox没有outerHTML用以下方法解决

/**

* 兼容firefox的 outerHTML 使用以下代码后,firefox可以使用element.outerHTML

**/

if(window.HTMLElement) {

HTMLElement.prototype.__defineSetter__("outerHTML",function(sHTML){

var r=this.ownerDocument.createRange();

r.setStartBefore(this);

var df=r.createContextualFragment(sHTML);

this.parentNode.replaceChild(df,this);

return sHTML;

});

HTMLElement.prototype.__defineGetter__("outerHTML",function(){

var attr;

var attrs=this.attributes;

var str="

for(var i=0;i

attr=attrs[i];

if(attr.specified)

str+=" "+attr.name+'="'+attr.value+'"';

}

if(!this.canHaveChildren)

return str+">";

return str+">"+this.innerHTML+""+this.tagName.toLowerCase()+">";

});

HTMLElement.prototype.__defineGetter__("canHaveChildren",function(){

switch(this.tagName.toLowerCase()){

case "area":

case "base":

case "basefont":

case "col":

case "frame":

case "hr":

case "img":

case "br":

case "input":

case "isindex":

case "link":

case "meta":

case "param":

return false;

}

return true;

});

}

测试有效.

关于insertAdjacentHTML兼容的解新决办法

//---在组件最后插入html代码

function InsertHtm(op,code,isStart){

if(Dvbbs_IsIE5)

op.insertAdjacentHTML(isStart ? "afterbegin" : "afterEnd",code);

else{

var range=op.ownerDocument.createRange();

range.setStartBefore(op);

var fragment = range.createContextualFragment(code);

if(isStart)

op.insertBefore(fragment,op.firstChild);

else

op.appendChild(fragment);

}

}

关于inner/outerHTML在NC6中的参考

DOM level 1 has no methods to allow for insertion of unparsed HTML into the document tree (as IE allows with insertAdjacentHTML or assignment to inner/outerHTML).NN6 (currently in beta as NN6PR3) know supports the .innerHTMLproperty of HTMLElements so that you can read or write the innerHTML of a page element like in IE4+.NN6 also provides a DOM level 2 compliant Range object to which a createContextualFragment('html source string')was added to spare DOM scripters the task of parsing html and creating DOM elements.You create a Range with var range = document.createRange();Then you should set its start point to the element where you want to insert the html for instance var someElement = document.getElementById('elementID'); range.setStartAfter(someElement);Then you create a document fragment from the html source to insert for example var docFrag = range.createContextualFragment('

Kibology for all.

');and insert it with DOM methods someElement.appendChild(docFrag);The Netscape JavaScript 1.5 version even provides so called setters for properties which together with the ability to prototype the DOM elements allows to emulate setting of outerHMTL for NN6: If you insert that script block you can then write cross browser code assigning to .innerHTML .outerHTMLfor instance document.body.innerHTML = '

Scriptology for all

';which works with both IE4/5 and NN6.The following provides getter functions for .outerHTMLto allow to read those properties in NN6 in a IE4/5 compatible way. Note that while the scheme of traversing the document tree should point you in the right direction the code example might not satisfy your needs as there are subtle difficulties when trying to reproduce the html source from the document tree. See for yourself whether you like the result and improve it as needed to cover other exceptions than those handled (for the empty elements and the textarea element). show document.documentElement.outerHTML| show document.body.outerHTML| show document.documentElement.innerHTML| show document.body.innerHTMLJavaScript.FAQTs.comKibology for all.

JavaScript.FAQTs.com

Kibology for all.
All for Kibology.
Note that the getter/setter feature is experimental and its syntax is subject to change.

HTMLElement.prototype.innerHTML setter = function (str) { var r = this.ownerDocument.createRange(); r.selectNodeContents(this); r.deleteContents(); var df = r.createContextualFragment(str); this.appendChild(df); return str;}HTMLElement.prototype.outerHTML setter = function (str) { var r = this.ownerDocument.createRange(); r.setStartBefore(this); var df = r.createContextualFragment(str); this.parentNode.replaceChild(df, this); return str;}

HTMLElement.prototype.innerHTML getter = function () { return getInnerHTML(this);}

function getInnerHTML(node) { var str = ""; for (var i=0; i

HTMLElement.prototype.outerHTML getter = function () { return getOuterHTML(this)}

function getOuterHTML(node) { var str = ""; switch (node.nodeType) { case 1: // ELEMENT_NODE str += "

if (node.childNodes.length == 0 && leafElems[node.nodeName]) str += ">"; else { str += ">"; str += getInnerHTML(node); str += "" } break; case 3: //TEXT_NODE str += node.nodeValue; break; case 4: // CDATA_SECTION_NODE str += ""; break; case 5: // ENTITY_REFERENCE_NODE str += "&" + node.nodeName + ";" break;

case 8: // COMMENT_NODE str += "" break; }

return str;}

var _leafElems = ["IMG", "HR", "BR", "INPUT"];var leafElems = {};for (var i=0; i<_leafelems.length i leafelems true>

然后我们可以封成JS引用

if (/Mozilla\/5\.0/.test(navigator.userAgent)) document.write('

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值