DOM 수를 줄이면 페이지를 구문 분석하는 과정에서 브라우저의 DOM 트리 및 렌더링 트리 구성 속도가 빨라져 페이지 성능이 향상될 수 있습니다. 이를 위해 TextArea의 첫 번째 화면 렌더링에서 표시되지 않는 페이지의 HTML 부분을 임시로 저장한 다음 렌더링이 완료된 후 이 HTML 부분을 처리하여 이 목적을 달성할 수 있습니다. TextArea에 임시 저장된 HTML 콘텐츠를 페이지에 추가하려면 해당 요소의 externalHTML 속성을 사용하는 것이 가장 쉽고 편리합니다. 그러나 지원되는 브라우저는 IE6, Safari, Operal 및 Chrome입니다. FF4.0에서 테스트되었으며 아직 지원되지 않습니다. 이제 크로스 브라우저 외부 HTML을 구현해 보겠습니다.
outerHTML은 요소 태그 자체를 포함하는 html을 가져오거나 설정하는 것입니다. 구현 코드는 다음과 같습니다.
2 "__defineSetter__", "__defineGetter__"는 Firefox 브라우저의 비공개 측면입니다. 속성 값을 설정할 때와 속성을 가져올 때 각각 수행할 작업을 정의합니다.
3 "__defineSetter__" "outerHTML"에서는 페이지에 너무 많은 요소를 삽입하여 성능에 영향을 미치는 빈번한 리플로우를 방지합니다. 문서 조각 객체 조각은 페이지에 삽입해야 하는 DOM 요소를 임시로 저장하는 데 사용됩니다.
4 "__defineGetter__" "outerHTML"의 요소 속성 속성을 사용하여 요소에 지정된 속성을 탐색합니다. innerHTML과 결합하면 원래 속성 자체를 포함하는 html 문자열이 반환됩니다.
outerHTML
< /head>
<script>if(HTMLElement 유형 !== "정의되지 않음" && !( HTMLElement.prototype의 "outerHTML")) { <br>console.log("define externalHTML") <br>HTMLElement.prototype.__defineSetter__("outerHTML",function(str){ <br>varragment = document.createDocumentFragment (); <br>var div = document.createElement("div"); <br>div.innerHTML = <br>for(var i=0, n = div.childNodes.length; n; i ){ <br>fragment.appendChild(div.childNodes[i]); <br>} <br>this.parentNode.replaceChild(fragment, this) <br>// <br>HTMLElement .prototype.__defineGetter__("outerHTML",function(){ <br>var tag = this.tagName; <br>var attribute = this.attributes; <br>var attr = []; <br>// for(var name in attribute){//프로토타입 체인의 멤버를 탐색합니다<br>for(var i=0,n = attribute.length; i<n; i){//n으로 지정된 속성 수<BR>if(속성[ i].specified){ <BR>attr.push(attributes[i].name '="' 속성[i].value '"') <BR>} <BR>} <BR>return ((!! this.innerHTML) ? <BR>'<' 태그 ' ' attr.join(' ') '>' this.innerHTML '</' 태그 '>' : <br>' <' 태그 ' ' attr.join(' ') '/>'); <br>} <br>var content = document.getElementById("content"); content.outerHTML) <br></script>
sdfdsdfsd
의 P에 대한 외부 HTML
코드를 가져오려는 경우:
var _p = document.getElementById('outerID')
_P = _P.cloneNode()
var _DIV = document.createElement ();
_DIV.appendChild(_P);
alert(_DIV.innerHTML)는 P의 외부 HTML입니다.
다음 해결 방법
/**
* Firefox 호환 externalHTML 다음 코드를 사용한 후 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; 프로토타입.__defineGetter__("outerHTML",function(){
var attr;
var attrs=this.attributes;
var str="<" this.tagName.toLowerCase();
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에 대한 새로운 솔루션 정보 호환성
function InsertHtm(op,code,isStart){
if (Dvbbs_IsIE5)
op.insertAdjacentHTML(isStart ? "afterbegin" : "afterEnd",code); {
var range=op.ownerDocument.createRange();
range.setStartBefore(op );
var 조각 = 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.com
Kibology for all.
All for Kibology.
getter/setter 기능은 실험적이며 해당 구문은 변경될 수 있습니다.
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 = ""; 스위치 (node.nodeType) { 사례 1: // ELEMENT_NODE str = "<" 노드.노드이름; for (var i=0; iif (node.childNodes.length == 0 && leafElems[node.nodeName]) str = ">"; else { str = ">"; str = getInnerHTML(노드); str = "<" node.nodeName ">" } 부서지다; 사례 3: //TEXT_NODE str = node.nodeValue; 부서지다; 사례 4: // CDATA_SECTION_NODE str = ""; 부서지다; 사례 5: // ENTITY_REFERENCE_NODE str = "&" node.nodeName ";" 부서지다;
사례 8: // COMMENT_NODE str = "" 부서지다; }
문자열 반환}
var _leafElems = ["IMG", "HR", "BR", "INPUT"];var leafElems = {};for (var i=0; i<_leafElems.length ; i ) leafElems[_leafElems[i]] = true; <… >');