วิธีรับ HTML สำหรับองค์ประกอบ DOM ใน javascript


97

ลองนึกภาพว่าฉันมี HTML ต่อไปนี้:

<div><span><b>This is in bold</b></span></div>

ฉันต้องการรับ HTML สำหรับ div รวมถึง div ด้วย Element.innerHTML ส่งคืนเฉพาะ:

<span>...</span>

ความคิดใด ๆ ? ขอบคุณ

คำตอบ:


88

เมื่อขยายคำตอบของ jldupont คุณสามารถสร้างองค์ประกอบการตัดได้ทันที:

var target = document.getElementById('myElement');
var wrap = document.createElement('div');
wrap.appendChild(target.cloneNode(true));
alert(wrap.innerHTML);

ฉันกำลังโคลนองค์ประกอบเพื่อหลีกเลี่ยงไม่ให้ลบและใส่องค์ประกอบในเอกสารจริงอีกครั้ง อาจมีราคาแพงหากองค์ประกอบที่คุณต้องการพิมพ์มีต้นไม้ขนาดใหญ่มากอยู่ด้านล่าง


สวัสดี - สมดุลนี่อาจเป็นตัวเลือกที่ดีที่สุดของฉัน ระวังเล็กน้อยในการถอด / ติดองค์ประกอบฉันไม่สามารถทำให้ DOM เสียหายได้และฉันไม่คาดว่าจะมีต้นไม้ใหญ่
Richard H

เว้นแต่ว่าmyElementจะเป็นองค์ประกอบที่ไม่สามารถเป็นลูกของ div เช่น li แถวตารางหรือเซลล์ตารางเป็นต้น
RobG

20
ตอนนี้เป็นปี 2013 การเรียก "domnode.outerHTML" ใช้งานได้กับเบราว์เซอร์หลักทั้งหมด (FF ตั้งแต่ v11)
Kevin

93

ใช้outerHTML:

var el = document.getElementById( 'foo' );
alert( el.outerHTML );

2
ไม่ใช่มันเป็นส่วนขยายของ IE แม้ว่าจะมีวิธีแก้ไขปัญหา Firefox อยู่: snipplr.com/view/5460/outerhtml-in-firefox
Wim

1
ดูเหมือนว่าเบราว์เซอร์ที่ใช้ WebKit จะรองรับ แต่ Firefox ไม่รองรับ
Jørn Schou-Rode

2
ตามquirksmode.org/dom/w3c_html.htmlควรทำงานใน IE, Opera, Safari และ Chrome
Majkel

18
โปรดทราบว่า outerHTML เป็นส่วนหนึ่งของ HTML5 ดังนั้นทุกคนควรได้รับการสนับสนุนทันเวลา
Xanthir

7
outerHTMLได้รับการสนับสนุนตั้งแต่ FF11: developer.mozilla.org/en-US/docs/Web/API/element.outerHTML
Felix Kling

8

ขั้นแรกใส่องค์ประกอบที่ล้อมรอบdivคำถามใส่idแอตทริบิวต์ในองค์ประกอบแล้วใช้getElementByIdกับองค์ประกอบนั้น: เมื่อคุณได้รับสัญญาแล้วให้ทำ "e.innerHTML" เพื่อดึง HTML

<div><span><b>This is in bold</b></span></div>

=> <div id="wrap"><div><span><b>This is in bold</b></span></div></div>

แล้ว:

var e=document.getElementById("wrap");
var content=e.innerHTML;

โปรดทราบว่าouterHTMLไม่สามารถใช้งานข้ามเบราว์เซอร์ได้


1
ปัญหาในการรับ innerHTML สำหรับผู้ปกครองของ div คือฉันจะได้ innerHTML สำหรับพี่น้องของ div ด้วย
Richard H

แย่จังฉันคิดว่า "ใส่แอตทริบิวต์ id ในองค์ประกอบ" อ้างถึง "องค์ประกอบ" ด้วยการแก้ไขครั้งล่าสุดของคุณชัดเจนขึ้นมากว่าคุณต้องการเพิ่มdivซุปเพิ่มเติม :)
Jørn Schou-Rode

@JP: ถ้าองค์ประกอบไม่ได้อยู่ในdocument... แล้วมันอยู่ที่ไหนคุณสนใจที่จะสอนพวกเราทั้งหมดหรือไม่?
jldupont

@JP: แน่นอนว่าคุณสามารถสร้างองค์ประกอบที่คุณต้องการได้ แต่นี่ไม่ใช่เหตุผลสำหรับการโหวตลดลง ... คุณจะไม่รู้จักเพื่อนที่นี่มากนักด้วยทัศนคติแบบนั้น
jldupont

ค่อนข้างแน่ใจว่า outerHTML สามารถใช้งานข้ามเบราว์เซอร์ได้เป็นเวลานาน - อย่ากลัวที่จะใช้
หิมะ

3

หากคุณต้องการให้มีขนาดเล็กลง แต่มีสคริปต์ที่ยาวขึ้นให้รับองค์ประกอบภายใน HTML และสร้างและโคลนพาเรนต์ว่างเท่านั้น -

function getHTML(who,lines){
    if(!who || !who.tagName) return '';

    var txt, ax, str, el= document.createElement('div');
    el.appendChild(who.cloneNode(false));
    txt= el.innerHTML;
    ax= txt.indexOf('>')+1;
    str= txt.substring(0, ax)+who.innerHTML+ txt.substring(ax);

    el= null;
    return lines? str.replace(/> *</g,'>\n<'): str;
    //easier to read if elements are separated
}


2

เนื่องจาก outerHTML เป็น IE เท่านั้นให้ใช้ฟังก์ชันนี้:

function getOuterHtml(node) {
    var parent = node.parentNode;
    var element = document.createElement(parent.tagName);
    element.appendChild(node);
    var html = element.innerHTML;
    parent.appendChild(node);
    return html;
}

สร้างองค์ประกอบที่ว่างเปล่าปลอมของประเภท parent และใช้ innerHTML จากนั้นแนบองค์ประกอบกลับเข้าไปในโดมปกติ


2

คุณจะต้องการสิ่งนี้เพื่อให้เป็นข้ามเบราว์เซอร์

function OuterHTML(element) {
    var container = document.createElement("div");
    container.appendChild(element.cloneNode(true));

    return container.innerHTML;
}

1
สิ่งนี้จะลบออกelementจากเอกสารเมื่อถูกเรียกใช่ไหม?
Jørn Schou-Rode

มันจะได้รับการแก้ไขแล้วโดยการเพิ่ม cloneNode ซึ่งทำให้มันค่อนข้างเหมือนกับคำตอบอื่น ๆ ที่นี่
Nikolas Stephan


0

กำหนดฟังก์ชัน outerHTML ตามการสนับสนุน element.outerHTML:

var temp_container = document.createElement("div"); // empty div not added to DOM
if (temp_container.outerHTML){
    var outerHTML = function(el){return el.outerHTML||el.nodeValue} // e.g. textnodes do not have outerHTML
  } else { // when .outerHTML is not supported
    var outerHTML = function(el){
      var clone = el.cloneNode(true);
      temp_container.appendChild(clone);
      outerhtml = temp_container.innerHTML;
      temp_container.removeChild(clone);
      return outerhtml;
    };
  };

-2
var el = document.getElementById('foo');
el.parentNode.innerHTML;

4
นี่จะให้ html สำหรับพี่น้องของ div ด้วยใช่ไหม
Richard H

การโหวตลงคืออะไร? คำถามเดิมไม่มีอะไรเกี่ยวข้องกับพี่น้อง คำตอบนี้เป็นคำตอบที่ถูกต้องสมบูรณ์ตามบริบทเดิมของคำถาม
Jason Leveille

ในทางกลับกันคำถามเดิมไม่เกี่ยวข้องกับผู้ปกครอง ดังนั้นอะไรก็ตาม
Jason Leveille
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.