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.