Javascript - Nối HTML vào phần tử container mà không có InternalHTML


167

Tôi cần một cách để nối HTML vào thành phần chứa mà không cần sử dụng InternalHTML. Lý do tại sao tôi không muốn sử dụng InternalHTML là vì khi nó được sử dụng như thế này:

element.innerHTML += htmldata

Nó hoạt động bằng cách thay thế tất cả các html trước khi thêm html cũ cộng với html mới. Điều này không tốt vì nó đặt lại phương tiện động như video flash nhúng ...

Tôi có thể làm theo cách này hoạt động:

var e = document.createElement('span');
e.innerHTML = htmldata;
element.appendChild(e);

Tuy nhiên, vấn đề với cách đó là có thêm thẻ span trong tài liệu mà tôi không muốn.

Làm thế nào điều này có thể được thực hiện sau đó? Cảm ơn!


1
Tại sao không sử dụng Jquery? Kiểm tra câu trả lời chi tiết của tôi dưới đây. stackoverflow.com/a/50482776/5320562
Loukan ElKadi

Câu trả lời:


102

Để đưa ra một giải pháp thay thế (vì việc sử dụng DocumentFragmentdường như không hoạt động): Bạn có thể mô phỏng nó bằng cách lặp lại các phần tử con của nút mới được tạo và chỉ nối thêm chúng.

var e = document.createElement('div');
e.innerHTML = htmldata;

while(e.firstChild) {
    element.appendChild(e.firstChild);
}

2
Tôi nghĩ rằng chúng tôi đang tìm kiếm một giải pháp không sử dụng "
InternalHTML

1
@kennydelacruz: OP không muốn nối thêm HTML mới vào HTML hiện có vì nó phá hủy và tái tạo các yếu tố hiện có. OP đã tìm ra giải pháp bằng cách tạo một yếu tố mới và nối thêm nhưng họ không muốn thêm một yếu tố bổ sung. Tôi chỉ mở rộng giải pháp đó để cho thấy rằng họ có thể di chuyển / nối các phần tử mới được tạo, không ảnh hưởng đến các phần tử hiện có.
Felix Kling

Tôi biết điều này đã cũ, nhưng bất cứ ai cũng có thể giải thích cho tôi tại sao người ta có thể lặp lại qua e.firstChild?
Toastgeraet

1
@Toastgeraet: Đây là ví dụ không được lặp lại qua e.firstChild . Thay vào đó, nó kiểm tra xem ecó con hay không và nếu có, hãy chuyển đứa trẻ đó sang phần tử.
Felix Kling

570

Tôi ngạc nhiên khi không có câu trả lời nào đề cập đến insertAdjacentHTML() phương pháp này. Kiểm tra nó ở đây . Tham số đầu tiên là nơi bạn muốn chuỗi được nối và lấy ("beforebegin", "afterbegin", "beforeend", "afterend"). Trong tình huống của OP, bạn sẽ sử dụng "trước". Tham số thứ hai chỉ là chuỗi html.

Cách sử dụng cơ bản:

var d1 = document.getElementById('one');
d1.insertAdjacentHTML('beforeend', '<div id="two">two</div>');

53
Chỉ cần thử giải pháp của bạn cũng như chấp nhận. Cả hai hoạt động, nhưng của bạn chỉ có 2 dòng và không có vòng lặp. Âm thanh như một người chiến thắng với tôi.
Corwin01

3
Để tham khảo cho bất kỳ ai có thể chọn tuyến đường này: Phương pháp này không chơi tốt với các bảng trong IE9.
Corwin01

2
Trong Chrome, nó cho tôi biết Uncaught TypeError: undefined is not a function!
J86

19
Viên ngọc ẩn này cần tiếp xúc nhiều hơn.
Seth

Bạn sẽ gặp lỗi nếu bạn cố gắng sử dụng phương pháp này trên một thứ không phải là Node, chỉ là FYI.
Alex W

15

alnafie có một câu trả lời tuyệt vời cho câu hỏi này. Tôi muốn đưa ra một ví dụ về mã của anh ấy để tham khảo:

var childNumber = 3;

function addChild() {
  var parent = document.getElementById('i-want-more-children');
  var newChild = '<p>Child ' + childNumber + '</p>';
  parent.insertAdjacentHTML('beforeend', newChild);
  childNumber++;
}
body {
  text-align: center;
}
button {
  background: rgba(7, 99, 53, .1);
  border: 3px solid rgba(7, 99, 53, 1);
  border-radius: 5px;
  color: rgba(7, 99, 53, 1);
  cursor: pointer;
  line-height: 40px;
  font-size: 30px;
  outline: none;
  padding: 0 20px;
  transition: all .3s;
}
button:hover {
  background: rgba(7, 99, 53, 1);
  color: rgba(255,255,255,1);
}
p {
  font-size: 20px;
  font-weight: bold;
}
<button type="button" onclick="addChild()">Append Child</button>
<div id="i-want-more-children">
  <p>Child 1</p>
  <p>Child 2</p>
</div>

Hy vọng điều này hữu ích cho người khác.


2
Tôi ghét phải là người kiên quyết cho các quy tắc nhưng tôi nghĩ sẽ tốt hơn nếu bạn tạo một bản demo (jsfiddle, codepen, v.v.) và sau đó thêm nó vào câu trả lời của Alnafie bằng cách sử dụng tính năng chỉnh sửa hoặc gửi nhận xét. Tạo câu trả lời chỉ để chứng minh câu trả lời của người dùng khác không phải là cách SO hoạt động, bất kể thông tin bạn cung cấp có hữu ích như thế nào. Hãy tưởng tượng nếu mọi người dùng quyết định thể hiện một câu trả lời khác bằng cách tạo ra một câu trả lời - nó sẽ trở nên lộn xộn.
Martin James

2
<div id="Result">
</div>

<script>
for(var i=0; i<=10; i++){
var data = "<b>vijay</b>";
 document.getElementById('Result').innerHTML += data;
}
</script>

gán dữ liệu cho div bằng ký hiệu "+ =" bạn có thể nối thêm dữ liệu bao gồm dữ liệu html trước đó


11
Câu hỏi đặc biệt yêu cầu không sử dụng element.innerHTML += data.
âm nhạc

1

Đây là những gì DocumentFragmentcó nghĩa là cho.

var frag = document.createDocumentFragment();
var span = document.createElement("span");
span.innerHTML = htmldata;
for (var i = 0, ii = span.childNodes.length; i < ii; i++) {
    frag.appendChild(span.childNodes[i]);
}
element.appendChild(frag);

document.createDocumentFragment, .childNodes


Tôi chỉ thử nghiệm điều này và nó không hoạt động. Có phải đó là cách nó nên được sử dụng?
Bob

Bạn đến (a)từ đâu Có phải đó là một lỗi đánh máy.
Ash Burlaczenko

1
Vâng, đó là một lỗi đánh máy, nó nên là e. Tôi không nghĩ bạn có thể sử dụng InternalHTML cho một đoạn. Điều này không hiệu quả
Bob

@Bob Tôi đã dùng cop-out sử dụng jQuery.
Raynos

jQuery không không! Tôi sẽ không bao gồm jQuery chỉ cho một chức năng nhỏ: \ Nó chỉ là quá mức cần thiết
Bob

-1

Làm thế nào để câu cá trong khi sử dụng mã nghiêm ngặt. Có hai chức năng tiên quyết cần thiết ở cuối bài này.

xml_add('before', id_('element_after'), '<span xmlns="http://www.w3.org/1999/xhtml">Some text.</span>');

xml_add('after', id_('element_before'), '<input type="text" xmlns="http://www.w3.org/1999/xhtml" />');

xml_add('inside', id_('element_parent'), '<input type="text" xmlns="http://www.w3.org/1999/xhtml" />');

Thêm nhiều phần tử (không gian tên chỉ cần có trên phần tử cha):

xml_add('inside', id_('element_parent'), '<div xmlns="http://www.w3.org/1999/xhtml"><input type="text" /><input type="button" /></div>');

Mã tái sử dụng động:

function id_(id) {return (document.getElementById(id)) ? document.getElementById(id) : false;}

function xml_add(pos, e, xml)
{
 e = (typeof e == 'string' && id_(e)) ? id_(e) : e;

 if (e.nodeName)
 {
  if (pos=='after') {e.parentNode.insertBefore(document.importNode(new DOMParser().parseFromString(xml,'application/xml').childNodes[0],true),e.nextSibling);}
  else if (pos=='before') {e.parentNode.insertBefore(document.importNode(new DOMParser().parseFromString(xml,'application/xml').childNodes[0],true),e);}
  else if (pos=='inside') {e.appendChild(document.importNode(new DOMParser().parseFromString(xml,'application/xml').childNodes[0],true));}
  else if (pos=='replace') {e.parentNode.replaceChild(document.importNode(new DOMParser().parseFromString(xml,'application/xml').childNodes[0],true),e);}
  //Add fragment and have it returned.
 }
}
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.