Làm cách nào để thay thế văn bản bên trong phần tử div?


166

Tôi cần thiết lập văn bản trong phần tử DIV một cách linh hoạt. Cách tiếp cận an toàn nhất, tốt nhất cho trình duyệt là gì? Tôi có nguyên mẫu và kịch bản có sẵn.

<div id="panel">
  <div id="field_name">TEXT GOES HERE</div>
</div>

Đây là chức năng sẽ như thế nào:

function showPanel(fieldName) {
  var fieldNameElement = document.getElementById('field_name');
  //Make replacement here
}

Câu trả lời được chấp nhận có làm những gì bạn muốn khi văn bản được gán như sau: - <span style = "font-size: 36pt"> Đây là lớn </ span>. Nếu hành vi này là mong muốn thì bạn có thể diễn đạt lại câu hỏi cho phù hợp?
AnthonyWJones

Điều này có thể được sử dụng trong một cuộc tấn công tiêm XSS?
James Westgate

Câu trả lời:


49

Tôi sẽ sử dụng updatephương thức của Prototype , hỗ trợ văn bản thuần túy, đoạn mã HTML hoặc bất kỳ đối tượng JavaScript nào xác định toStringphương thức.

$("field_name").update("New text");

26
@Aeyoun OP ngụ ý rằng họ đã sử dụng Prototype, vì vậy nếu đó là trường hợp hợp lý để tận dụng lợi thế của nó.
John Topley

6
Tại sao với tôi chỉ hoạt động với$("field_name").text("new text");
Drako

@Drako Bạn đang sử dụng PrototypeJS?
John Topley

10
@Drako Câu hỏi ban đầu và câu trả lời của tôi từ bảy năm trước là dành cho PrototypeJS chứ không phải jQuery.
John Topley

255

Bạn chỉ có thể sử dụng:

fieldNameElement.innerHTML = "My new text!";

2
Không nên sử dụng dấu ngoặc đơn cho văn bản 'tĩnh'?
Milan Babuškov

5
Trong PHP, vâng. Trong JavaScript, tôi không tin nó quan trọng.
ceejayoz

46
Trong Javascript, dấu ngoặc đơn và dấu ngoặc kép có thể hoán đổi cho nhau.
17 trên 26 tháng

18
lời khuyên tồi, vì văn bản có thể vô tình chứa nội dung giống như đánh dấu HTML
Trident D'Gao

10
element.innerHTML = "<script>doSomethingMalicious()</script>";sẽ không phải là một ý tưởng tốt. element.innerHTML = "& neither will this";
Joseph Nields

175

Cập nhật cho mọi người đọc này vào năm 2013 và sau đó:

Câu trả lời này có rất nhiều SEO, nhưng tất cả các câu trả lời đã hết hạn và phụ thuộc vào các thư viện để làm những việc mà tất cả các trình duyệt hiện tại làm được.

Để thay thế văn bản bên trong một phần tử div, hãy sử dụng Node.textContent, được cung cấp trong tất cả các trình duyệt hiện tại.

fieldNameElement.textContent = "New text";

10
@Legolas Do đó viết 'trình duyệt hiện tại' hai năm trước.
mikemaccana

2
Cảm ơn bạn! Tôi đã thử các câu trả lời khác, tự hỏi tại sao 'InternalHTML' không hoạt động.
GreySage

2
Bạn có thể xem xét giải thích lý do tại sao textContentlà một phương pháp ưu việt để innerHTML: nó nhanh hơn, an toàn hơn và phù hợp hơn khi không cố tình chèn đánh dấu HTML.
SurePerformance

75

function showPanel(fieldName) {
  var fieldNameElement = document.getElementById("field_name");
  while(fieldNameElement.childNodes.length >= 1) {
    fieldNameElement.removeChild(fieldNameElement.firstChild);
  }
  fieldNameElement.appendChild(fieldNameElement.ownerDocument.createTextNode(fieldName));
}

Những lợi thế của việc làm theo cách này:

  1. Nó chỉ sử dụng DOM, vì vậy kỹ thuật này có thể di chuyển sang các ngôn ngữ khác và không phụ thuộc vào bên trongHTML không chuẩn
  2. fieldName có thể chứa HTML, có thể là một cuộc tấn công XSS đã cố gắng. Nếu chúng ta biết đó chỉ là văn bản, chúng ta nên tạo một nút văn bản, thay vì trình duyệt phân tích nó thành HTML

Nếu tôi định sử dụng thư viện javascript, tôi sẽ sử dụng jQuery và làm điều này:


  $("div#field_name").text(fieldName);

Lưu ý rằng nhận xét của @AnthonyWJones là chính xác: "field_name" không phải là tên mô tả hoặc tên biến đặc biệt.


Những ngôn ngữ khác bạn có thể chuyển kỹ thuật này sang?
John Topley

Bất kỳ ngôn ngữ nào có triển khai DOM đều hỗ trợ điều này (và hầu hết các ngôn ngữ đều có triển khai DOM).
Quentin

Đây là câu trả lời tốt, tốt hơn của tôi và là câu trả lời chính xác. Bạn có thể xem xét thu dọn ví dụ mặc dù. 'tên trường' không phải là một tên hay cho tham số của hàm. Trong thực tế, tốt nhất là lấy hai cái cho ID phần tử và cái khác cho nội dung, nghĩa là; elemID, nội dung
AnthonyWJones

Tôi đã mượn fieldName và ID từ chính câu hỏi.
Daniel Papasian

Câu hỏi có lẽ đã sử dụng field_name để làm ví dụ chung chung. Ngoài ra người hỏi đề cập rằng Prototype có sẵn nhưng không phải jQuery.
John Topley

17
$('field_name').innerHTML = 'Your text.';

Một trong những tính năng tiện lợi của Prototype là $('field_name')hoạt động tương tự nhưdocument.getElementById('field_name') . Sử dụng nó! :-)

Câu trả lời của John Topley sử dụng updatechức năng của Prototype là một giải pháp tốt khác.


4
Trông không giống JavaScript?
Milan Babuškov

1
Đừng sử dụng InternalHTML. Đây không phải là khuyến nghị của w3c và hành xử không nhất quán. Đó được coi là phong cách xấu.
Tom

Tom, cái gì nên được sử dụng thay thế (nếu bạn không sử dụng Prototype)?
Milan Babuškov

1
Milan, cách được chấp nhận nhiều hơn là lặp qua childNodes, gọi removeNode (true) trên mỗi nút, sau đó nối các nút mới được tạo bằng document.createEuity () hoặc document.createTextNode (). Nếu bạn cần làm điều đó, tôi khuyên bạn nên viết một hàm để tránh gõ nhiều.
Joel Anair

3
@RaduSimionescu Không, không phải vậy. Câu hỏi và câu trả lời này là về Prototype.js, không phải jQuery. Trong Prototype $tìm kiếm một mục bằng ID. Nó không dựa trên bộ chọn như jQuery. api.prototypejs.org/dom/dollar
ceejayoz

15

Câu trả lời nhanh là sử dụng InternalHTML (hoặc phương thức cập nhật của nguyên mẫu gần giống như vậy). Vấn đề với InternalHTML là bạn cần thoát khỏi nội dung được gán. Tùy thuộc vào mục tiêu của bạn, bạn sẽ cần phải làm điều đó với mã khác HOẶC

trong IE: -

document.getElementById("field_name").innerText = newText;

trong FF: -

document.getElementById("field_name").textContent = newText;

(Trên thực tế FF có mã hiện tại như sau)

HTMLElement.prototype.__defineGetter__("innerText", function () { return this.textContent; })

HTMLElement.prototype.__defineSetter__("innerText", function (inputText) { this.textContent = inputText; })

Bây giờ tôi chỉ có thể sử dụng InternalText nếu bạn cần hỗ trợ trình duyệt rộng nhất có thể thì đây không phải là một giải pháp hoàn chỉnh nhưng cũng không sử dụng InternalHTML trong bản thô.


7

Nếu bạn thực sự muốn chúng tôi tiếp tục nơi bạn rời đi, bạn có thể làm:

if (fieldNameElement)
    fieldNameElement.innerHTML = 'some HTML';

5

nodeValue cũng là một thuộc tính DOM tiêu chuẩn mà bạn có thể sử dụng:

function showPanel(fieldName) {
  var fieldNameElement = document.getElementById(field_name);
  if(fieldNameElement.firstChild)
    fieldNameElement.firstChild.nodeValue = "New Text";
}


1

Nếu bạn có xu hướng bắt đầu sử dụng nhiều JavaScript trên trang web của mình, jQuery sẽ giúp việc chơi với DOM cực kỳ đơn giản.

http://docs.jquery.com/Quản lý

Làm cho nó đơn giản như: $ ("# tên trường"). Văn bản ("Một số văn bản mới.");


Nguyên mẫu có chức năng tiện ích tương tự.
ceejayoz


0
function showPanel(fieldName) {
  var fieldNameElement = document.getElementById(field_name);

  fieldNameElement.removeChild(fieldNameElement.firstChild);
  var newText = document.createTextNode("New Text");
  fieldNameElement.appendChild(newText);
}

Tốt hơn là thay thế nút sau đó để loại bỏ nó và thêm một nút mới như hai hoạt động riêng biệt.
Quentin

0

Đây là một cách dễ dàng của jQuery :

var el = $('#yourid .yourclass');

el.html(el.html().replace(/Old Text/ig, "New Text"));

Đây có vẻ là một ý tưởng tồi - nếu phần tử của bạn chứa các mã con có cùng văn bản hoặc văn bản của bạn khớp với một phần của tên thẻ phần tử thì sao? Tại sao không chỉ sử dụng .text?
James Westgate

Tôi hoàn toàn đồng ý với James Westgate, không nên làm điều đó.
TGarrett

0

Trong HTML đặt điều này

<div id="field_name">TEXT GOES HERE</div>

Trong Javascript đặt điều này

var fieldNameElement = document.getElementById('field_name');
        if (fieldNameElement)
        {fieldNameElement.innerHTML = 'some 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.