Nếu tôi có một nhịp, nói:
<span id="myspan"> hereismytext </span>
Làm cách nào để sử dụng JavaScript để thay đổi "hereismytext" thành "newtext"?
Nếu tôi có một nhịp, nói:
<span id="myspan"> hereismytext </span>
Làm cách nào để sử dụng JavaScript để thay đổi "hereismytext" thành "newtext"?
Câu trả lời:
Đối với các trình duyệt hiện đại, bạn nên sử dụng:
document.getElementById("myspan").textContent="newtext";
Mặc dù các trình duyệt cũ hơn có thể không biết textContent
, nhưng không nên sử dụng innerHTML
vì nó giới thiệu lỗ hổng XSS khi văn bản mới là đầu vào của người dùng (xem các câu trả lời khác bên dưới để thảo luận chi tiết hơn):
//POSSIBLY INSECURE IF NEWTEXT BECOMES A VARIABLE!!
document.getElementById("myspan").innerHTML="newtext";
textContent
thay vào đó, như vậy những người mới sẽ được khuyến khích sử dụng các phương pháp phù hợp và an toàn?
Sử dụng innerHTML là SO KHÔNG NÊN . Thay vào đó, bạn nên tạo một textNode. Bằng cách này, bạn đang "ràng buộc" văn bản của mình và ít nhất là trong trường hợp này, bạn không dễ bị tấn công XSS.
document.getElementById("myspan").innerHTML = "sometext"; //INSECURE!!
Đúng cách
span = document.getElementById("myspan");
txt = document.createTextNode("your cool text");
span.appendChild(txt);
Để biết thêm thông tin về lỗ hổng này: Cross Site Scripting (XSS) - OWASP
Đã chỉnh sửa tiểu thuyết thứ 4 năm 2017:
Sửa đổi dòng mã thứ ba theo đề xuất @mumush : "sử dụng appendChild (); thay vào đó".
Btw, theo @Jimbo Jonny Tôi nghĩ mọi thứ nên được coi là đầu vào của người dùng bằng cách áp dụng nguyên tắc Bảo mật theo lớp. Bằng cách đó bạn sẽ không gặp phải bất ngờ.
innerHTML
yêu cầu thận trọng, lưu ý rằng giải pháp của bạn sử dụng innerText
không được hỗ trợ trong Firefox. quirksmode.org/dom/html Nó cũng sử dụng textContent
không được hỗ trợ trong IE8. Bạn có thể cấu trúc mã để khắc phục những vấn đề này.
span.appendChild(txt);
thay thế!
innerHTML
không được khuyến nghị là vô lý. Chưa kể nó vẫn ổn một khi được vệ sinh. Ý tưởng rằng người ta nên vệ sinh đầu vào của người dùng là KHÔNG LIÊN QUAN ĐẾN câu hỏi cụ thể này. Nhiều nhất nó có một lưu ý nhỏ ở cuối là "btw: nếu đầu vào của người dùng, hãy đảm bảo vệ sinh trước hoặc sử dụng phương thức X không cần đến nó" .
span.innerHTML = "";
sau đó appendChild?
EDIT: Điều này đã được viết vào năm 2014. Có lẽ bạn không quan tâm đến IE8 nữa và có thể quên sử dụng innerText
. Chỉ cần sử dụng textContent
và được thực hiện với nó, hoan hô.
Nếu bạn là người cung cấp văn bản và không có phần văn bản nào được cung cấp bởi người dùng (hoặc một số nguồn khác mà bạn không kiểm soát), thì cài đặt innerHTML
có thể được chấp nhận:
// * Fine for hardcoded text strings like this one or strings you otherwise
// control.
// * Not OK for user-supplied input or strings you don't control unless
// you know what you are doing and have sanitized the string first.
document.getElementById('myspan').innerHTML = 'newtext';
Tuy nhiên, như những người khác lưu ý, nếu bạn không phải là nguồn cho bất kỳ phần nào của chuỗi văn bản, việc sử dụng innerHTML
có thể khiến bạn bị tấn công nội dung như XSS nếu trước tiên bạn không cẩn thận vệ sinh văn bản đúng cách.
Nếu bạn đang sử dụng đầu vào từ người dùng, đây là một cách để làm điều đó một cách an toàn trong khi vẫn duy trì khả năng tương thích giữa nhiều trình duyệt:
var span = document.getElementById('myspan');
span.innerText = span.textContent = 'newtext';
Firefox không hỗ trợ innerText
và IE8 không hỗ trợ textContent
nên bạn cần sử dụng cả hai nếu bạn muốn duy trì khả năng tương thích giữa nhiều trình duyệt.
Và nếu bạn muốn tránh phản xạ (gây ra bởi innerText
) nếu có thể:
var span = document.getElementById('myspan');
if ('textContent' in span) {
span.textContent = 'newtext';
} else {
span.innerText = 'newtext';
}
Đây là một cách khác:
var myspan = document.getElementById('myspan');
if (myspan.innerText) {
myspan.innerText = "newtext";
}
else
if (myspan.textContent) {
myspan.textContent = "newtext";
}
Thuộc tính InternalText sẽ được Safari, Google Chrome và MSIE phát hiện. Đối với Firefox, cách làm tiêu chuẩn là sử dụng textContent nhưng kể từ phiên bản 45, nó cũng có một thuộc tính bên trong, như một người nào đó vui lòng thông báo cho tôi gần đây. Giải pháp này kiểm tra xem liệu trình duyệt có hỗ trợ một trong hai thuộc tính này hay không và nếu có, hãy gán "newtext".
Bản demo trực tiếp: tại đây
Ngoài các câu trả lời javascript thuần túy ở trên, Bạn có thể sử dụng phương thức văn bản jQuery như sau:
$('#myspan').text('newtext');
Nếu bạn cần mở rộng câu trả lời để nhận / thay đổi nội dung html của một phần tử span hoặc div, bạn có thể làm điều này:
$('#mydiv').html('<strong>new text</strong>');
Người giới thiệu:
.text (): http://api.jquery.com/text/
.html (): http://api.jquery.com/html/
Bạn cũng có thể sử dụng phương thức querySelector (), giả sử id 'myspan' là duy nhất vì phương thức trả về phần tử đầu tiên với bộ chọn được chỉ định:
document.querySelector('#myspan').textContent = 'newtext';
Giống như trong câu trả lời khác, InternalHTML và InternalText không được khuyến nghị, tốt hơn nên sử dụng textContent . Thuộc tính này được hỗ trợ tốt, bạn có thể kiểm tra nó: http://caniuse.com/#search=textContent
document.getElementById("myspan").textContent="newtext";
điều này sẽ chọn nút dom với id myspan
và thay đổi nội dung văn bản thànhnew text
Đối với khoảng này
<span id="name">sdfsdf</span>
Bạn có thể đi như thế này: -
$("name").firstChild.nodeValue = "Hello" + "World";