Cách lấy HTML cho phần tử DOM trong javascript


94

Hãy tưởng tượng tôi có HTML sau:

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

Tôi muốn lấy HTML cho div, bao gồm cả chính div. Element.innerHTML chỉ trả về:

<span>...</span>

Bất kỳ ý tưởng? Cảm ơn

Câu trả lời:


87

Mở rộng câu trả lời của jldupont, bạn có thể tạo một phần tử gói ngay lập tức:

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

Tôi đang sao chép phần tử để tránh phải xóa và lắp lại phần tử trong tài liệu thực tế. Tuy nhiên, điều này có thể tốn kém nếu phần tử bạn muốn in có một cây rất lớn bên dưới nó.


chào - trên cân bằng, đây có lẽ là lựa chọn tốt nhất của tôi. cảnh giác một chút với việc tách / gắn các phần tử, tôi không thể vặn được DOM và tôi không mong đợi sẽ có những cây lớn.
Richard H

Trừ khi myElement là một phần tử không thể là con của div, như li, hàng trong bảng hoặc ô bảng, v.v.
RobG

20
Bây giờ là năm 2013, gọi "domnode.outerHTML" hoạt động trên tất cả các trình duyệt chính (FF kể từ phiên bản 11)
Kevin

87

Sử dụng outerHTML:

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

2
Không, nó là một phần mở rộng của IE. Mặc dù có tồn tại các cách giải quyết của Firefox: snipplr.com/view/5460/outerhtml-in-firefox
Wim

1
Các trình duyệt dựa trên WebKit dường như hỗ trợ nó, nhưng Firefox thì không.
Jørn Schou-Rode

2
Theo quirksmode.org/dom/w3c_html.html, nó sẽ hoạt động trên IE, Opera, Safari và Chrome.
Majkel

18
Xin lưu ý rằng externalHTML là một phần của HTML5 và vì vậy cần được mọi người hỗ trợ kịp thời.
Xanthir

7
outerHTMLđược hỗ trợ kể từ FF11: developer.mozilla.org/en-US/docs/Web/API/element.outerHTML .
Felix Kling,

8

Đầu tiên, đặt phần tử bao bọc divcâu hỏi được đề cập, đặt một idthuộc tính trên phần tử đó và sau đó sử dụng getElementByIdnó: khi bạn đã có lement, chỉ cần thực hiện 'e.innerHTML` để truy xuất 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>

và sau đó:

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

Lưu ý rằng outerHTMLkhông tương thích với nhiều trình duyệt.


1
vấn đề với việc lấy innerHTML cho cha mẹ của div là tôi cũng sẽ lấy innerHTML cho các anh chị em của div
Richard H

Thật tệ, tôi nghĩ rằng "đặt thuộc tính id trên phần tử" được gọi là "phần tử". Với chỉnh sửa cuối cùng của bạn là rõ ràng hơn rất nhiều mà bạn muốn bổ sung thêm một divđến súp :)
Jørn SCHOU-Rode

@JP: nếu phần tử không có trong document... thì nó nằm ở đâu, bạn có quan tâm khai sáng cho tất cả chúng tôi không?
jldupont

@JP: tất nhiên bạn có thể tạo ra các yếu tố ở nơi bạn muốn nhưng đây không phải là lý do để bỏ phiếu ... bạn sẽ không kết bạn nhiều ở đây với thái độ như vậy.
jldupont

Khá chắc chắn rằng externalHTML đã tương thích với nhiều trình duyệt trong một thời gian dài - đừng ngại sử dụng nó.
Tuyết

3

Nếu bạn muốn có một dấu chân nhẹ hơn, nhưng một kịch bản dài hơn, có được những yếu tố innerHTML và chỉ tạo ra và sao chép các sản phẩm nào phụ huynh

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

vì externalHTML chỉ dành cho IE, hãy sử dụng chức năng này:

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;
}

tạo một phần tử rỗng không có thật của kiểu cha và sử dụng innerHTML trên đó rồi gắn lại phần tử đó vào dom bình thường


2

Bạn sẽ muốn một cái gì đó như thế này để nó được trình duyệt chéo.

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

    return container.innerHTML;
}

1
Điều này sẽ xóa elementkhỏi tài liệu khi được gọi, phải không?
Jørn Schou-Rode

Nó sẽ khắc phục điều đó ngay bây giờ bằng cách thêm cloneNode, làm cho nó khá giống với một số câu trả lời khác ở đây.
Nikolas Stephan

1

câu hỏi cũ nhưng dành cho những người mới đến:

document.querySelector('div').outerHTML


0

định nghĩa hàm ngoàiHTML dựa trên sự hỗ trợ cho 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
điều này cũng sẽ cung cấp cho tôi bất kỳ html cho anh chị em của div mặc dù phải không?
Richard H

Có gì với cuộc bỏ phiếu xuống? Câu hỏi ban đầu không liên quan gì đến anh chị em ruột. Câu trả lời này là một câu trả lời hoàn toàn hợp lệ với ngữ cảnh ban đầu của câu hỏi.
Jason Leveille

Mặt khác, câu hỏi ban đầu không liên quan gì đến phụ huynh. Vậy sao cũng được.
Jason Leveille
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.