Cách chuyển đổi HTMLElement thành một chuỗi


84

Tôi sẽ tạo một phần tử XML trong JavaScript để trao đổi dữ liệu với phía máy chủ. Tôi thấy tôi có thể làm điều đó với document.createElement. Nhưng tôi không biết làm thế nào để chuyển đổi nó thành chuỗi. Có API nào trong trình duyệt để làm cho nó dễ dàng hơn không? Hoặc có thư viện JS nào bao gồm API này không?

CHỈNH SỬA: Tôi thấy rằng API XMLSerializer của trình duyệt, nó phải là cách phù hợp để tuần tự hóa thành chuỗi.


Câu trả lời:


38

Bạn có thể lấy 'external-html' bằng cách sao chép phần tử, thêm nó vào vùng chứa rỗng, 'offstage' và đọc nộiHTML của vùng chứa.

Ví dụ này có tham số thứ hai tùy chọn.

Gọi document.getHTML (phần tử, true) để bao gồm các phần tử con của phần tử.

document.getHTML= function(who, deep){
    if(!who || !who.tagName) return '';
    var txt, ax, el= document.createElement("div");
    el.appendChild(who.cloneNode(false));
    txt= el.innerHTML;
    if(deep){
        ax= txt.indexOf('>')+1;
        txt= txt.substring(0, ax)+who.innerHTML+ txt.substring(ax);
    }
    el= null;
    return txt;
}

1
Bạn cũng có thể gọi trực tiếp domElement.outerHTML( w3schools.com/jsref/prop_html_outerhtml.asp )
user007

146

outerHTMLThuộc tính phần tử (lưu ý: được Firefox hỗ trợ sau phiên bản 11 ) trả về HTML của toàn bộ phần tử.

Thí dụ

<div id="new-element-1">Hello world.</div>

<script type="text/javascript"><!--

var element = document.getElementById("new-element-1");
var elementHtml = element.outerHTML;
// <div id="new-element-1">Hello world.</div>

--></script>

Tương tự, bạn có thể sử dụng innerHTMLđể lấy HTML có trong một phần tử nhất định hoặc innerTextđể lấy văn bản bên trong một phần tử (không đánh dấu HTML).

Xem thêm

  1. ngoàiHTML - Thuộc tính Javascript
  2. Tham chiếu Javascript - Các phần tử

Nhưng có vẻ như tôi không thể lấy văn bản bên trong với thuộc tính ngoàiHTML. Tôi nghĩ những gì tôi thực sự muốn là đánh dấu HTML.
xiao 啸

3
NgoàiHTML được hỗ trợ trong FF từ v11 developer.mozilla.org/en-US/docs/Web/API/element.outerHTML
llamerr

NgoàiHTML được hỗ trợ trong hầu hết các trình duyệt hiện đại: caniuse.com/#feat=mdn-api_element_outerhtml
Williams A.

1

Cách dễ dàng nhất để làm là sao chép innerHTML của phần tử đó vào biến tmp và làm cho nó trống, sau đó nối phần tử mới và sau đó sao chép lại biến tmp vào đó. Đây là một ví dụ tôi đã sử dụng để thêm tập lệnh jquery vào đầu.

var imported = document.createElement('script');
imported.src = 'http://code.jquery.com/jquery-1.7.1.js';
var tmpHead = document.head.innerHTML;
document.head.innerHTML = "";
document.head.append(imported);
document.head.innerHTML += tmpHead;

Thật đơn giản :)


0

Có một tagNametài sản và một attributestài sản nữa:

var element = document.getElementById("wtv");
var openTag = "<"+element.tagName;
for (var i = 0; i < element.attributes.length; i++) {
    var attrib = element.attributes[i];
    openTag += " "+attrib.name + "=" + attrib.value;
}
openTag += ">";
alert(openTag);

Xem thêm Làm thế nào để lặp qua tất cả các thuộc tính trong một phần tử HTML? (Tôi đã làm!)

Để lấy nội dung giữa các thẻ mở và thẻ đóng, bạn có thể sử dụng innerHTMLnếu không muốn lặp lại tất cả các phần tử con ...

alert(element.innerHTML);

... và sau đó nhận lại thẻ đóng với tagName.

var closeTag = "</"+element.tagName+">";
alert(closeTag);

Tôi e rằng đôi khi phải mất một thời gian để viết mã nhận được toàn bộ đánh dấu.
xiao 啸

Nếu XML của nó thì tất cả phải nằm trong một nút gốc, phải không? Nếu vậy, bạn chỉ phải làm điều này đối với nút gốc - innerHTML được hỗ trợ trên tất cả các trình duyệt chính và sẽ cung cấp cho bạn X (H) TML được lồng trong nút gốc. (tức là mọi thứ!)
Richard JP Le Guen

1
Tại sao phải lặp lại các thuộc tính của phần tử và xây dựng một chuỗi 'thẻ' từ nó? Chỉ cần bọc phần tử trong phần tử KHÁC và lấy innerHTML của phần tử mẹ mới đó. Thì đấy, giải pháp tức thì cho ngoàiHTML.
Marc B

0

Điều này có thể không áp dụng cho tất cả mọi người, nhưng khi giải nén từ xml, tôi gặp sự cố này, tôi đã giải quyết được vấn đề này.

function grab_xml(what){
var return_xml =null;
    $.ajax({
                type: "GET",
                url: what,
                success:function(xml){return_xml =xml;},
        async:   false
        });
return(return_xml);
}

sau đó lấy xml:

var sector_xml=grab_xml("p/sector.xml");
var tt=$(sector_xml).find("pt");

Sau đó, tôi thực hiện chức năng này để trích xuất dòng xml, khi tôi cần đọc từ tệp XML, có chứa các thẻ html.

    function extract_xml_line(who){
    var tmp = document.createElement("div");
    tmp.appendChild(who[0]);
    var tmp=$(tmp.innerHTML).html();
    return(tmp);
}

và bây giờ để kết luận:

var str_of_html= extract_xml_line(tt.find("intro")); //outputs the intro tag and whats inside it: helllo  <b>in bold</b>

0

Tôi đang sử dụng Angular, và cần điều tương tự, và đã hạ cánh tại bài đăng này.

@ViewChild('myHTML', {static: false}) _html: ElementRef;
this._html.nativeElement;

0

Giả sử phần tử của bạn là toàn bộ [object HTMLDocument]. Bạn có thể chuyển đổi nó thành Chuỗi theo cách này:

const htmlTemplate = `<!DOCTYPE html><html lang="en"><head></head><body></body></html>`;

const domparser = new DOMParser();
const doc = domparser.parseFromString(htmlTemplate, "text/html"); // [object HTMLDocument]

const doctype = '<!DOCTYPE html>';
const html = doc.documentElement.outerHTML;

console.log(doctype + html);

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.