phần tử và thêm nó vàophần tử bằng cách sử dụng các phương thức createElement() và appendChild(). Thứ ba, lấy HTML củaphần tử sử dụng thuộc tính InternalHTML củayếu tốInternalHTML hoạt động như thế nào trong Javascript?
Thuộc tính innerHTML trả về. Nội dung văn bản của phần tử, bao gồm tất cả khoảng cách và các thẻ HTML bên trong. Thuộc tính InternalText trả về. Chỉ nội dung văn bản của phần tử và tất cả các phần tử con của nó, không có khoảng cách văn bản và thẻ ẩn CSS, ngoại trừ
Khi tôi đang viết một số JS cơ bản để thực hiện thao tác DOM và lắng nghe sự kiện, tôi đã gặp phải một lỗi khiến tôi bối rối. Tôi đã dành thời gian nghiền ngẫm Stack Overflow, tìm kiếm giải pháp vô ích. Để sao chép lỗi, tôi sẽ trình bày một phiên bản đơn giản hóa mã của mình
Để bắt đầu, tôi có một tệp HTML cơ bản với một div
duy nhất trong phần thân
HTML cơ bản với một divTrong tệp JavaScript, tôi đã thêm một số nút vào DOM và tạo một trình xử lý sự kiện trên một nút
Sử dụng 'innerHTML' để thao tác DOMTrong trình duyệt, trang của tôi xuất hiện như mong đợi. Có một hình ảnh, theo sau là một nút và một số văn bản bổ sung mà tôi đã thêm vào DOM
Nội dung trong trình duyệt webNhìn lướt qua mã, nút có mục đích được xác định rõ ràng. Khi được nhấp vào, chuỗi hello
sẽ được xuất ra bảng điều khiển. Tuy nhiên, khi nhấp vào nút, không có gì được in. Tại sao?
Trước tiên, hãy thử và tìm nơi lỗi được đưa vào mã. Để bắt đầu, tôi sẽ nhận xét dòng div.innerHTML +=
Bây giờ, khi tôi nhấp vào nút, mọi thứ hoạt động như mong đợi. Khi nhấp vào nút, hello
được ghi vào bảng điều khiển
Nút hoạt động như mong đợiRõ ràng, dòng với innerHTML +=
đang gây ra vấn đề lớn. Là một lập trình viên JS, việc sử dụng các toán tử như ++
và +=
dường như là điều tự nhiên. Tuy nhiên, sử dụng toán tử +=
với
document.getElementById("Test").innerHTML = "Test
";
1 sẽ gây ra vấn đề lớn. Dưới đây chúng ta sẽ thảo luận tại saoĐang thêm vào div
0 Phân tích lại toàn bộ thẻ
Khi bạn sử dụng toán tử chắp thêm với
document.getElementById("Test").innerHTML = "Test
";
1, Javascript sẽ phân tích lại nội dung của toàn bộ thẻ và tạo lại tất cả các phần tử HTMLdiv
0 Rất Chậm
Như một tác dụng phụ tự nhiên của lý do trước đó, việc lặp lại làm cho
document.getElementById("Test").innerHTML = "Test
";
1 cực kỳ chậm. Đối với một tài liệu HTML nhỏ có văn bản tĩnh, đây có thể không phải là vấn đề. Tuy nhiên, với các tài liệu lớn hơn, quá trình phân tích lại cực kỳ tốn thời gian và có thể có những tác dụng phụ ngoài ý muốn.document.getElementById("Test").innerHTML = "Test
";
6 Xóa trình lắng nghe sự kiệnKết luận rõ ràng nhất từ thử nghiệm ngắn gọn của chúng tôi là
document.getElementById("Test").innerHTML = "Test
";
1 xóa trình xử lý sự kiện đã được thêm vào DOM trước đó. Vì toàn bộ thẻ (_______3 trong mã của chúng tôi) đang được phân tích lại, trình xử lý sự kiện sẽ bị mất trong quá trình này. Thay vì sử dụng toán tử +=
, hãy sử dụng các hàm DOM chẳng hạn như div
8document.getElementById("Test").innerHTML = "Test
";
6 Trình bày Rủi ro Bảo mậtViệc sử dụng
document.getElementById("Test").innerHTML = "Test
";
1 tạo ra rủi ro bảo mật tiềm ẩn cho trang web của bạn. Người dùng độc hại có thể sử dụng tập lệnh chéo trang (XSS) để thêm tập lệnh phía máy khách độc hại nhằm đánh cắp thông tin người dùng riêng tư được lưu trữ trong cookie phiênBạn có thể đọc tài liệu MDN trên
document.getElementById("Test").innerHTML = "Test
";
1Các phương thức tuân thủ W3C có thể dễ dàng thêm các phần tử DOM mới
Các phương pháp như hello
2, hello
3, div
8 và hello
5 cho phép thao tác DOM an toàn mà không gây hậu quả ngoài ý muốn của
document.getElementById("Test").innerHTML = "Test
";
1 (và cụ thể hơn là hello
7). Trừ khi bạn chỉ đơn giản là đặt văn bản bên trong thẻ HTML, chẳng hạn như hello
8 hoặc hello
9, hãy tránh xa document.getElementById("Test").innerHTML = "Test
";
1Đối với người mới bắt đầu,
document.getElementById("Test").innerHTML = "Test
";
1 có vẻ như là cách dễ dàng và tao nhã nhất để thao tác các phần tử cơ bản trên DOM. Tuy nhiên, khi JS của bạn tham gia nhiều hơn và DOM của bạn tăng kích thước, thì document.getElementById("Test").innerHTML = "Test
";
1 sẽ ảnh hưởng đến hiệu suất và gây ra rủi ro bảo mật
Lợi thế của InternalHTML trong JavaScript là gì?
Nó cho phép mã JavaScript điều khiển một trang web đang được hiển thị . Cụ thể hơn, nó đặt hoặc trả về nội dung HTML (HTML bên trong) của một phần tử. Thuộc tính innerHTML được sử dụng rộng rãi để sửa đổi nội dung của trang web vì đây là cách dễ dàng nhất để sửa đổi DOM.
Mục đích chính của InternalHTML là gì?
InnerHTML thuộc tính Phần tử lấy hoặc đặt mã đánh dấu HTML hoặc XML có trong phần tử . Để chèn HTML vào tài liệu thay vì thay thế nội dung của một phần tử, hãy sử dụng phương thức insertAdjacentHTML().
Tại sao bạn không nên sử dụng InternalHTML trong JavaScript?
Việc sử dụng InternalHTML tạo ra rủi ro bảo mật tiềm ẩn cho trang web của bạn. Người dùng độc hại có thể sử dụng tập lệnh chéo trang (XSS) để thêm tập lệnh phía máy khách độc hại nhằm đánh cắp thông tin người dùng riêng tư được lưu trữ trong cookie phiên
Khi nào tôi nên sử dụng InternalHTML?
Như đã đề cập trong hướng dẫn InternalHTML, bạn chỉ nên sử dụng nó khi dữ liệu đến từ một nguồn đáng tin cậy như cơ sở dữ liệu . Nếu bạn đặt nội dung mà bạn không có quyền kiểm soát vào bên trongHTML, mã độc hại có thể được đưa vào và thực thi.