DOM 노드의 문자열 표현 가져 오기


96

Javascript : 노드 (요소 또는 문서)의 DOM 표현이 있고 그 문자열 표현을 찾고 있습니다. 예 :

var el = document.createElement("p");
el.appendChild(document.createTextNode("Test"));

산출해야합니다 :

get_string(el) == "<p>Test</p>";

나는 사소한 일을 놓치고 있다는 강한 느낌을 가지고 있지만 IE, FF, Safari 및 Opera에서 작동하는 방법을 찾지 못했습니다. 따라서 outerHTML은 옵션이 아닙니다.


4
아마도 버전 11과 함께 Firefox는 outerHTML도 지원합니다 : bugzilla.mozilla.org/show_bug.cgi?id=92264
Boldewyn 2011

1
지금은 IE, FF, Safari, Chrome, Opera가 모두 outerHTML을 지원합니다. developer.mozilla.org/en-US/docs/Web/API/Element/outerHTML
wangf

1
예, 이제 (2009 년 이후로) 사소한 작업이되었습니다. :)
Boldewyn

네, 확실히 outerHTML에
neaumusic

답변:


133

임시 부모 노드를 만들고 그 내부 HTML 콘텐츠를 가져올 수 있습니다.

var el = document.createElement("p");
el.appendChild(document.createTextNode("Test"));

var tmp = document.createElement("div");
tmp.appendChild(el);
console.log(tmp.innerHTML); // <p>Test</p>

편집 : outerHTML에 대한 아래 답변을 참조하십시오. el.outerHTML 만 있으면됩니다.


1
아야. 아주 간단합니다 ... 약간의 참고 : 전체 문서를 "문자열 화"하고 싶다면 document.documentElement (사용 사례 : AJAX 요청)와 동일한 메서드를 사용할 수 있습니다. 아마도 그것을 대답에 포함시킬 수 있습니까?
Boldewyn

3
@Boldewyn : 전체 document.documentElement를 div에 추가 할 수 있습니까? 이런 쓰레기 ....
Roatin Marth

단순, 지옥으로 ... +1 너무 나쁜의 DocumentFragment는 innerHTML을 지원하지 않습니다
라요스 메스 자 로스

30
outerHTML에 답이다
neaumusic

3
element추가 할 tmp때에서 tmp제거되므로 추가 하기 전에 복제하는 것을 잊지 마십시오 document.
Olcay Ertaş 2016-08-27

44

당신이 찾고있는 것은 'outerHTML'이지만 이전 브라우저와 호환되지 않는 대체 coz가 필요합니다.

var getString = (function() {
  var DIV = document.createElement("div");

  if ('outerHTML' in DIV)
    return function(node) {
      return node.outerHTML;
    };

  return function(node) {
    var div = DIV.cloneNode();
    div.appendChild(node.cloneNode(true));
    return div.innerHTML;
  };

})();

// getString(el) == "<p>Test</p>"

내 jQuery 플러그인은 여기에서 찾을 수 있습니다. 선택한 요소의 외부 HTML 가져 오기


outerHTML질문을 한 후 Firefox 가 버전 11에 추가 되었습니다. 그 당시에는 옵션이 아니 었습니다. 자세히 살펴보면 적절한 의견으로 질문을 업데이트했습니다.
Boldewyn 2013

이 권리, 당신은 드롭 사촌 요소 ID의 다른 attrs에 사용하는 경우innerHtml
세르게이 Panfilov

1
@SergeyPanfilov : 호출하기 전에 빈 div에 노드를 래핑했기 때문에 아무것도 삭제하지 않았습니다 innerHTML. )
gtournie 2015-06-05

3
2015 년에는 이것이 가장 좋은 답이라고 말하고 싶습니다.
ACK_stoverflow

예, 현재로서는 아주 오래된 (IE> 10, Safari> 7, 진정한 고대 FF, Chrome) 및 / 또는 모호한 브라우저 (Opera Mini) 만이 outerHTML속성을 지원하지 않습니다 . 참조 caniuse.com/#feat=xml-serializer
거트 Sønderby

20

나는 이것을 위해 복잡한 스크립트가 필요하다고 생각하지 않습니다. 그냥 사용

get_string=(el)=>el.outerHTML;

이 최고의 답변입니다
아브라함

15

FF에서 XMLSerializer객체를 사용하여 XML을 문자열로 직렬화 할 수 있습니다 . IE는 xml노드 의 속성을 제공 합니다. 따라서 다음을 수행 할 수 있습니다.

function xml2string(node) {
   if (typeof(XMLSerializer) !== 'undefined') {
      var serializer = new XMLSerializer();
      return serializer.serializeToString(node);
   } else if (node.xml) {
      return node.xml;
   }
}

참고 .xml로 현재 페이지의 노드에서와 같이 DOM 노드에서 작동하지 않습니다. XML DOM 문서 노드에서만 작동합니다.
Crescent Fresh

반대로 outerHTMLXML DOM 문서 노드에서는 작동하지 않습니다. DOM 노드에서만 작동합니다 (현재 페이지의 노드에서와 같이). 좋은 일관성이 있습니다.
Crescent Fresh

7

Element # outerHTML 사용 :

var el = document.createElement("p");
el.appendChild(document.createTextNode("Test"));

console.log(el.outerHTML);

DOM 요소를 작성하는데도 사용할 수 있습니다. Mozilla 문서에서 :

요소 DOM 인터페이스의 outerHTML 속성은 하위 요소를 포함하여 요소를 설명하는 직렬화 된 HTML 조각을 가져옵니다. 지정된 문자열에서 구문 분석 된 노드로 요소를 대체하도록 설정할 수 있습니다.

https://developer.mozilla.org/en-US/docs/Web/API/Element/outerHTML


3

element.outerHTML을 사용하여 외부 태그 및 속성을 포함하여 요소의 전체 표현을 가져옵니다.


1

요소에 부모가있는 경우

element.parentElement.innerHTML

2
답변 해주셔서 감사합니다! 불행히도 이미 제안되었지만 답변자가 답변을 삭제했습니다. 문제는 부모가 원하는 것보다 훨씬 더 많은 마크 업을 포함 할 수 있다는 것입니다. <li>목록 의 단일 에 대해 outerHTML을 생각 하십시오.
Boldewyn 2015 년

1

시험

new XMLSerializer().serializeToString(element);

제안 해 주셔서 감사하지만 Bryan Kale이 그의 답변에서 제안한 것입니다.
Boldewyn

1

내 사용 사례에서 항상 전체 outerHTML을 원하지는 않는다는 것을 알았습니다. 많은 노드에는 표시 할 자식이 너무 많습니다.

다음은 기능입니다 (최소한 Chrome에서 테스트 됨).

/**
 * Stringifies a DOM node.
 * @param {Object} el - A DOM node.
 * @param {Number} truncate - How much to truncate innerHTML of element.
 * @returns {String} - A stringified node with attributes
 *                     retained.
 */
function stringifyEl(el, truncate) {
    var truncateLen = truncate || 50;
    var outerHTML = el.outerHTML;
    var ret = outerHTML;
    ret = ret.substring(0, truncateLen);

    // If we've truncated, add an elipsis.
    if (outerHTML.length > truncateLen) {
      ret += "...";
    }
    return ret;
}

https://gist.github.com/kahunacohen/467f5cc259b5d4a85eb201518dcb15ec


0

받아 들여진 답변의 코드로 DOMElements를 반복 할 때 무엇이 ​​잘못되었는지 알아내는 데 많은 시간을 낭비했습니다. 이것이 나를 위해 일한 것입니다. 그렇지 않으면 모든 두 번째 요소가 문서에서 사라집니다.

_getGpxString: function(node) {
          clone = node.cloneNode(true);
          var tmp = document.createElement("div");
          tmp.appendChild(clone);
          return tmp.innerHTML;
        },

1
나는 당신이 여기에 다른 문제가 있다고 생각할 때 팔다리로 나가지 않습니다. 위의 솔루션 DOM에서 원래 요소를 제거 합니다. 따라서 와 같은 라이브 컬렉션 을 사용하면 document.getElementsByTagName()해당 컬렉션이 중간 for루프 를 변경 하므로 모든 두 번째 요소를 건너 뜁니다.
Boldewyn 2014 년

-1

반응을 사용하는 경우 :

const html = ReactDOM.findDOMNode(document.getElementsByTagName('html')[0]).outerHTML;

.outerHTMLReact 전용이 아닙니다. DOM 표준입니다. @Rich Apodaca의 답변을 확인하십시오.
chharvey dec.

예 ... 내 대답에 대한 관심 지점 (반응을 사용하는 경우)은 reactdom.findDOMNode()..., 아니 .outerHTML였지만 위치에 감사드립니다.
victorkurauchi
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.