>웹 프론트엔드 >JS 튜토리얼 >Firefox 외부 HTML 구현 code_javascript 기술

Firefox 외부 HTML 구현 code_javascript 기술

WBOY
WBOY원래의
2016-05-16 18:51:561075검색

DOM 수를 줄이면 페이지를 구문 분석하는 과정에서 브라우저의 DOM 트리 및 렌더링 트리 구성 속도가 빨라져 페이지 성능이 향상될 수 있습니다. 이를 위해 TextArea의 첫 번째 화면 렌더링에서 표시되지 않는 페이지의 HTML 부분을 임시로 저장한 다음 렌더링이 완료된 후 이 HTML 부분을 처리하여 이 목적을 달성할 수 있습니다. TextArea에 임시 저장된 HTML 콘텐츠를 페이지에 추가하려면 해당 요소의 externalHTML 속성을 사용하는 것이 가장 쉽고 편리합니다. 그러나 지원되는 브라우저는 IE6, Safari, Operal 및 Chrome입니다. FF4.0에서 테스트되었으며 아직 지원되지 않습니다. 이제 크로스 브라우저 외부 HTML을 구현해 보겠습니다.
outerHTML은 요소 태그 자체를 포함하는 html을 가져오거나 설정하는 것입니다. 구현 코드는 다음과 같습니다.

코드 복사 코드는 다음과 같습니다.

if( typeof HTMLElement !== "정의되지 않음" && !(HTMLElement.prototype의 "outerHTML")) {
//console.log("define externalHTML")
HTMLElement.prototype.__defineSetter__("outerHTML",function (str){
var 조각 = document.createDocumentFragment();
var div = document.createElement("div")
div.innerHTML =
for(var i=0, n = div.childNodes .length; ifragment.appendChild(div.childNodes[i])
}
this.parentNode.replaceChild(fragment, this); >})//
HTMLElement.prototype.__defineGetter__("outerHTML",function(){
var tag = this.tagName;
var attribute = this.attributes;
var attr = [];
//for(속성의 var name){//프로토타입 체인의 멤버 탐색
for(var i=0,n = attribute.length; iif(attributes[i].specified){
attr.push(attributes[i].name '="' attribute[i].value '"')
}
}
return ((!!this.innerHTML) ?
'<' 태그 ' ' attr.join(' ') '>' this.innerHTML '' :
'<' 태그 ' ' attr.join(' ') '/>')
}


:
1 in code 먼저, 브라우저의 기본 구현을 덮어쓰지 않도록 브라우저가 externalHTML을 지원하는지 여부를 감지하는 조건부 판단이 이루어집니다.
2 "__defineSetter__", "__defineGetter__"는 Firefox 브라우저의 비공개 측면입니다. 속성 값을 설정할 때와 속성을 가져올 때 각각 수행할 작업을 정의합니다.
3 "__defineSetter__" "outerHTML"에서는 페이지에 너무 많은 요소를 삽입하여 성능에 영향을 미치는 빈번한 리플로우를 방지합니다. 문서 조각 객체 조각은 페이지에 삽입해야 하는 DOM 요소를 임시로 저장하는 데 사용됩니다.
4 "__defineGetter__" "outerHTML"의 요소 속성 속성을 사용하여 요소에 지정된 속성을 탐색합니다. innerHTML과 결합하면 원래 속성 자체를 포함하는 html 문자열이 반환됩니다.
테스트 코드:




outerHTML<BR>< /head> <br><body> <br><div id="content" class="test"> <br><p>다음 목록이 포함됩니다. 그것 <br><ul> <br><li>항목 1</li> <br><li>항목 2</li> <br><li>항목 3</li> ; <br><li>항목 4</li> <br></div> <br><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> <br></body> <br><br><br><p id="outerID">sdfdsdfsd</p>의 P에 대한 외부 HTML <br> 코드를 가져오려는 경우: <br><div class="codetitle"> <span><a style="CURSOR: pointer" data="21684" class="copybut" id="copybut21684" onclick="doCopy('code21684')"><u>코드 복사 </u> </a></span> 코드는 다음과 같습니다. </div> <div class="codebody" id="code21684"> <br>var _p = document.getElementById('outerID') <br>_P = _P.cloneNode() <br> var _DIV = document.createElement (); <br>_DIV.appendChild(_P); <br>alert(_DIV.innerHTML)는 P의 외부 HTML입니다. <br> </div> <br> 다음 해결 방법<br><div class="codetitle"> <span><a style="CURSOR: pointer" data="61205" class="copybut" id="copybut61205" onclick="doCopy('code61205')"><u>코드 복사</u></a></span> 코드는 다음과 같습니다.</div> <div class="codebody" id="code61205"> <br>/**<br>* Firefox 호환 externalHTML 다음 코드를 사용한 후 Firefox는 element.outerHTML을 사용할 수 있습니다. <br>**/ <br>if(window.HTMLElement) { <br>HTMLElement.prototype.__defineSetter__("outerHTML",function(sHTML){ <br>var r=this.ownerDocument.createRange(); <br>r .setStartBefore(this); <br>var df=r.createContextualFragment(sHTML); <br>this.parentNode.replaceChild(df,this) <br>return sHTML; 프로토타입.__defineGetter__("outerHTML",function(){ <br>var attr; <br>var attrs=this.attributes; <br>var str="<" this.tagName.toLowerCase(); <BR>for (var i=0;i<attrs.length;i ) { <BR>attr=attrs[i]; <BR>if(attr.specified) <BR>str =" " attr.name '="' attr. value '"'; <BR>} <BR>if( !this.canHaveChildren) <BR>return str ">"; <br>return str ">" this.innerHTML "</" this.tagName. toLowerCase() ">"; <br>}) <br>HTMLElement.prototype.__defineGetter__("canHaveChildren",function(){ <br>switch(this.tagName.toLowerCase()){ <br>case " Area": ​​​​<br>case "base": <br> case "basefont": <br>case "col": <br>case "frame": <br>case "hr": <br>case " img": <br>case "br": <br>case " input": <br>case "isindex": <br>case "link": <br>case "meta": <br>case "param" : <br>return false; <br>} <br>return true ; <br>}) <br>} <br><br> <br>insertAdjacentHTML에 대한 새로운 솔루션 정보 호환성</div> <br><br><br><div class="codetitle">코드 복사<span><a style="CURSOR: pointer" data="42642" class="copybut" id="copybut42642" onclick="doCopy('code42642')"><u> 코드는 다음과 같습니다. </u></a> </span>//---html 코드 삽입 구성요소의 끝에서 </div>function InsertHtm(op,code,isStart){ <div class="codebody" id="code42642">if (Dvbbs_IsIE5) <br>op.insertAdjacentHTML(isStart ? "afterbegin" : "afterEnd",code); { <br>var range=op.ownerDocument.createRange(); <br>range.setStartBefore(op ); <br>var 조각 = range.createContextualFragment(code) <br>if(isStart) <br>op. insertBefore(fragment,op.firstChild); <br>else <br>op.appendChild(fragment) <br>} <br>} <br><br> <br>关于inner/outerHTML在NC6中的参考 <br>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('<P>Kibology for all.</P>');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:<SCRIPT LANGUAGE="JavaScript1.5">if (navigator.appName == 'Netscape') { HTMLElement.prototype.outerHTML setter = function (html) { this.outerHTMLInput = html; var range = this.ownerDocument.createRange(); range.setStartBefore(this); var docFrag = range.createContextualFragment(html); this.parentNode.replaceChild(docFrag, this); }}</SCRIPT> If you insert that script block you can then write cross browser code assigning to .innerHTML .outerHTMLfor instance document.body.innerHTML = '<P>Scriptology for all</P>';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).<HTML><HEAD><STYLE></STYLE><SCRIPT LANGUAGE="JavaScript1.5">var emptyElements = { HR: true, BR: true, IMG: true, INPUT: true};var specialElements = { TEXTAREA: true};HTMLElement.prototype.outerHTML getter = function () { return getOuterHTML (this);}function getOuterHTML (node) { var html = ''; switch (node.nodeType) { case Node.ELEMENT_NODE: html += '<'; html += node.nodeName; if (!specialElements[node.nodeName]) { for (var a = 0; a < node.attributes.length; a++) html += ' ' + node.attributes[a].nodeName.toUpperCase() + '="' + node.attributes[a].nodeValue + '"'; html += '>'; if (!emptyElements[node.nodeName]) { html += node.innerHTML; html += '<\/' + node.nodeName + '>'; } } else switch (node.nodeName) { case 'TEXTAREA': for (var a = 0; a < node.attributes.length; a++) if (node.attributes[a].nodeName.toLowerCase() != 'value') html += ' ' + node.attributes[a].nodeName.toUpperCase() + '="' + node.attributes[a].nodeValue + '"'; else var content = node.attributes[a].nodeValue; html += '>'; html += content; html += '<\/' + node.nodeName + '>'; break; } break; case Node.TEXT_NODE: html += node.nodeValue; break; case Node.COMMENT_NODE: html += '<!' + '--' + node.nodeValue + '--' + '>'; break; } return html;}</SCRIPT></HEAD><BODY><A HREF="javascript: alert(document.documentElement.outerHTML); void 0">show document.documentElement.outerHTML</A>|<A HREF="javascript: alert(document.body.outerHTML); void 0">show document.body.outerHTML</A>|<A HREF="javascript: alert(document.documentElement.innerHTML); void 0">show document.documentElement.innerHTML</A>|<A HREF="javascript: alert(document.body.innerHTML); void 0">show document.body.innerHTML</A><FORM NAME="formName"><TEXTAREA NAME="aTextArea" ROWS="5" COLS="20">JavaScript.FAQTs.comKibology for all.</TEXTAREA></FORM><DIV><P>JavaScript.FAQTs.com</P><BLOCKQUOTE>Kibology for all.<BR>All for Kibology.</BLOCKQUOTE></DIV></BODY></HTML>getter/setter 기능은 실험적이며 해당 구문은 변경될 수 있습니다. <br>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;} <br>HTMLElement.prototype.innerHTML getter = function () { return getInnerHTML(this);} <br>function getInnerHTML(node) { var str = ""; for (var i=0; i<node.childnodes.length i str="getOuterHTML(node.childNodes.item(i));" return>HTMLElement.prototype.outerHTML getter = function () { return getOuterHTML(this)} <br>function getOuterHTML(node) { var str = ""; 스위치 (node.nodeType) { 사례 1: // ELEMENT_NODE str = "<" 노드.노드이름; for (var i=0; i<node.attributes.length; i ) { if (node.attributes.item(i).nodeValue != null) { str = " " str = node.attributes.item(i). 노드이름; str = "=""; str = node.attributes.item(i).nodeValue; str = """; } } <BR>if (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 = "<![CDATA[" node.nodeValue "]]>"; 부서지다; 사례 5: // ENTITY_REFERENCE_NODE str = "&" node.nodeName ";" 부서지다; <br>사례 8: // COMMENT_NODE str = "<!--" node.nodeValue "-->" 부서지다; } <br>문자열 반환} <br>var _leafElems = ["IMG", "HR", "BR", "INPUT"];var leafElems = {};for (var i=0; i<_leafElems.length ; i ) leafElems[_leafElems[i]] = true; <… ></sc' '찢어짐>'); <br><br><br><div class="codetitle"> <span>复主代码<a style="CURSOR: pointer" data="24889" class="copybut" id="copybut24889" onclick="doCopy('code24889')"><u></u> 代码如下:</a></span> </div><script 언어="JavaScript" type="텍스트 /자바스크립트"> <div class="codebody" id="code24889"><!-- <BR>var emptyElements = { HR: true, BR: true, IMG: true, INPUT: true }; var SpecialElements = { TEXTAREA: true }; <BR>HTMLElement.prototype.outerHTML getter = function() { <BR>return getOuterHTML(this); <BR>} <BR>function getOuterHTML(node) { <BR>var html = ''; <BR>스위치(node.nodeType) { <BR>case Node.ELEMENT_NODE: html = '<'; html = node.nodeName; if (!specialElements[node.nodeName]) { <BR>for (var a = 0; a < node.attributes.length; a ) <BR>html = ' ' node.attributes[a].nodeName.toUpperCase( ) '="' node.attributes[a].nodeValue '"'; <BR>html = '>'; <br>if (!emptyElements[node.nodeName]) { <br>html = node.innerHTML; <br>html = '</' node.nodeName '>'; <br>} <br>} else <br>switch (node.nodeName) { <br>case 'TEXTAREA': for (var a = 0; a < node.attributes.length; a ) <BR>if ( node.attributes[a].nodeName.toLowerCase() != 'value') <BR>html <BR> = ' ' node.attributes[a].nodeName.toUpperCase() '="' node.attributes[a] .nodeValue <BR> '"'; <BR>else <BR>var content = node.attributes[a].nodeValue; <BR>html = '>'; HTML = 내용; html = '</' node.nodeName '>'; 부서지다; <br>} 휴식; <br>case Node.TEXT_NODE: html = node.nodeValue; 부서지다; <br>case Node.COMMENT_NODE: html = '<!' '--' node.nodeValue '--' '>'; 부서지다; <br>} <br>html을 반환합니다. <br>} <br>//--> <br></script> <br><br><br> </div></node.childnodes.length> </div> </ul> </div></div><div class="nphpQianMsg"><div class="clear"></div></div><div class="nphpQianSheng"><span>성명:</span><div>본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.</div></div></div><div class="nphpSytBox"><span>이전 기사:<a class="dBlack" title="javascript HTMLEncode HTMLDecode(IE 및 Firefox와 호환)_javascript 기술의 전체 예" href="https://m.php.cn/ko/faq/24147.html">javascript HTMLEncode HTMLDecode(IE 및 Firefox와 호환)_javascript 기술의 전체 예</a></span><span>다음 기사:<a class="dBlack" title="javascript HTMLEncode HTMLDecode(IE 및 Firefox와 호환)_javascript 기술의 전체 예" href="https://m.php.cn/ko/faq/24149.html">javascript HTMLEncode HTMLDecode(IE 및 Firefox와 호환)_javascript 기술의 전체 예</a></span></div><div class="nphpSytBox2"><div class="nphpZbktTitle"><h2>관련 기사</h2><em><a href="https://m.php.cn/ko/article.html" class="bBlack"><i>더보기</i><b></b></a></em><div class="clear"></div></div><ins class="adsbygoogle" style="display:block" data-ad-format="fluid" data-ad-layout-key="-6t+ed+2i-1n-4w" data-ad-client="ca-pub-5902227090019525" data-ad-slot="8966999616"></ins><script> (adsbygoogle = window.adsbygoogle || []).push({}); </script><ul class="nphpXgwzList"><li><b></b><a href="https://m.php.cn/ko/faq/1609.html" title="Bootstrap 목록 그룹 구성 요소에 대한 심층 분석" class="aBlack">Bootstrap 목록 그룹 구성 요소에 대한 심층 분석</a><div class="clear"></div></li><li><b></b><a href="https://m.php.cn/ko/faq/1640.html" title="JavaScript 함수 커링에 대한 자세한 설명" class="aBlack">JavaScript 함수 커링에 대한 자세한 설명</a><div class="clear"></div></li><li><b></b><a href="https://m.php.cn/ko/faq/1949.html" title="JS 비밀번호 생성 및 강도 감지의 전체 예(데모 소스 코드 다운로드 포함)" class="aBlack">JS 비밀번호 생성 및 강도 감지의 전체 예(데모 소스 코드 다운로드 포함)</a><div class="clear"></div></li><li><b></b><a href="https://m.php.cn/ko/faq/2248.html" title="Angularjs는 WeChat UI(weui)를 통합합니다." class="aBlack">Angularjs는 WeChat UI(weui)를 통합합니다.</a><div class="clear"></div></li><li><b></b><a href="https://m.php.cn/ko/faq/2351.html" title="JavaScript를 사용하여 중국어 번체와 중국어 간체 간을 빠르게 전환하는 방법과 중국어 간체와 중국어 번체 간 전환을 지원하는 웹사이트의 요령_javascript 기술" class="aBlack">JavaScript를 사용하여 중국어 번체와 중국어 간체 간을 빠르게 전환하는 방법과 중국어 간체와 중국어 번체 간 전환을 지원하는 웹사이트의 요령_javascript 기술</a><div class="clear"></div></li></ul></div></div><ins class="adsbygoogle" style="display:block" data-ad-format="autorelaxed" data-ad-client="ca-pub-5902227090019525" data-ad-slot="5027754603"></ins><script> (adsbygoogle = window.adsbygoogle || []).push({}); </script><footer><div class="footer"><div class="footertop"><img src="/static/imghwm/logo.png" alt=""><p>공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!</p></div><div class="footermid"><a href="https://m.php.cn/ko/about/us.html">회사 소개</a><a href="https://m.php.cn/ko/about/disclaimer.html">부인 성명</a><a href="https://m.php.cn/ko/update/article_0_1.html">Sitemap</a></div><div class="footerbottom"><p> © php.cn All rights reserved </p></div></div></footer><script>isLogin = 0;</script><script type="text/javascript" src="/static/layui/layui.js"></script><script type="text/javascript" src="/static/js/global.js?4.9.47"></script></div><script src="https://vdse.bdstatic.com//search-video.v1.min.js"></script><link rel='stylesheet' id='_main-css' href='/static/css/viewer.min.css' type='text/css' media='all'/><script type='text/javascript' src='/static/js/viewer.min.js?1'></script><script type='text/javascript' src='/static/js/jquery-viewer.min.js'></script><script>jQuery.fn.wait = function (func, times, interval) { var _times = times || -1, //100次 _interval = interval || 20, //20毫秒每次 _self = this, _selector = this.selector, //选择器 _iIntervalID; //定时器id if( this.length ){ //如果已经获取到了,就直接执行函数 func && func.call(this); } else { _iIntervalID = setInterval(function() { if(!_times) { //是0就退出 clearInterval(_iIntervalID); } _times <= 0 || _times--; //如果是正数就 -- _self = $(_selector); //再次选择 if( _self.length ) { //判断是否取到 func && func.call(_self); clearInterval(_iIntervalID); } }, _interval); } return this; } $("table.syntaxhighlighter").wait(function() { $('table.syntaxhighlighter').append("<p class='cnblogs_code_footer'><span class='cnblogs_code_footer_icon'></span></p>"); }); $(document).on("click", ".cnblogs_code_footer",function(){ $(this).parents('table.syntaxhighlighter').css('display','inline-table');$(this).hide(); }); $('.nphpQianCont').viewer({navbar:true,title:false,toolbar:false,movable:false,viewed:function(){$('img').click(function(){$('.viewer-close').trigger('click');});}}); </script></body><!-- Matomo --><script> var _paq = window._paq = window._paq || []; /* tracker methods like "setCustomDimension" should be called before "trackPageView" */ _paq.push(['trackPageView']); _paq.push(['enableLinkTracking']); (function() { var u="https://tongji.php.cn/"; _paq.push(['setTrackerUrl', u+'matomo.php']); _paq.push(['setSiteId', '9']); var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0]; g.async=true; g.src=u+'matomo.js'; s.parentNode.insertBefore(g,s); })(); </script><!-- End Matomo Code --></html>