Hướng dẫn why is innerhtml bad - tại sao Internalhtml xấu

Vâng, elm.innerHTML += str; là một ý tưởng rất tồi. Sử dụng elm.insertAdjacentHTML[ 'beforeend', str ] như là sự thay thế hoàn hảo.
Use elm.insertAdjacentHTML[ 'beforeend', str ] as the perfect alternative.

Câu trả lời điển hình "Trình duyệt phải xây dựng lại DOM" thực sự không thực hiện câu hỏi công lý:

  1. Đầu tiên, trình duyệt cần đi qua từng yếu tố theo ELM, mỗi thuộc tính của chúng và tất cả các văn bản & nhận xét & các nút xử lý của họ, và thoát khỏi chúng để xây dựng cho bạn một chuỗi.

  2. Sau đó, bạn có một chuỗi dài, mà bạn đã tham gia. Bước này là ok.

  3. Thứ ba, khi bạn đặt bên trong, trình duyệt phải loại bỏ tất cả các phần tử, thuộc tính và các nút mà nó vừa đi qua.

  4. Sau đó, nó phân tích chuỗi, xây dựng từ tất cả các yếu tố, thuộc tính và các nút mà nó chỉ bị phá hủy, để tạo ra một đoạn DOM mới chủ yếu là giống hệt nhau.

  5. Cuối cùng, nó gắn các nút mới và trình duyệt phải bố trí toàn bộ. Điều này có thể tránh được [xem phương án bên dưới], nhưng ngay cả khi [các] nút được thêm vào bố cục, các nút cũ sẽ có các thuộc tính bố cục của chúng được lưu trong bộ nhớ cache thay vì được tính toán lại từ mới.

  6. Nhưng nó vẫn chưa được thực hiện! Trình duyệt cũng phải tái chế các nút cũ bằng cách quét tất cả các biến JavaScript.

Problems:

  • Một số thuộc tính có thể không được phản ánh bởi HTML, ví dụ, giá trị hiện tại của sẽ bị mất và đặt lại về giá trị ban đầu trong HTML.

  • Nếu bạn có bất kỳ trình xử lý sự kiện nào trên các nút cũ, chúng sẽ bị phá hủy và bạn phải gắn lại tất cả chúng.

  • Nếu mã JS của bạn đang tham khảo bất kỳ nút cũ nào, chúng sẽ không bị phá hủy mà thay vào đó sẽ được mồ côi. Chúng thuộc về tài liệu nhưng không còn trong cây Dom. Khi mã của bạn truy cập chúng, không có gì có thể xảy ra hoặc nó có thể gây ra lỗi.

  • Cả hai vấn đề có nghĩa là nó không thân thiện với các plugin JS - các plugin có thể gắn trình xử lý hoặc giữ tham chiếu đến các nút cũ và gây rò rỉ bộ nhớ.

  • Nếu bạn có thói quen thực hiện thao tác DOM với InsideHTML, bạn có thể vô tình thay đổi tài sản hoặc làm những việc khác mà bạn không muốn.

  • Bạn càng có nhiều nút, điều này càng kém hiệu quả, càng có nhiều nước ép pin.

Nói tóm lại, nó không hiệu quả, nó dễ bị lỗi, nó chỉ đơn giản là lười biếng và không hiểu biết.

Giải pháp thay thế tốt nhất là Element.insertAdjacentHTML, mà tôi chưa thấy câu trả lời khác đề cập đến:, that I haven't seen other answers mention:

elm.insertAdjacentHTML[ 'beforeend', str ]

Gần như cùng một mã, không có vấn đề của InsideHTML. Không xây dựng lại, không có người xử lý bị mất, không thiết lập lại đầu vào, phân mảnh bộ nhớ ít hơn, không có thói quen xấu, không có sự sáng tạo và bài tập của yếu tố thủ công.

Nó cho phép bạn tiêm chuỗi HTML vào các phần tử trong một dòng, bao gồm các thuộc tính và thậm chí cho phép Yow tiêm tổng hợp và nhiều phần tử. Tốc độ của nó được tối ưu hóa - trong thử nghiệm của Mozilla, nó nhanh hơn 150 lần.

Trong trường hợp ai đó nói với bạn rằng nó không phải là trình duyệt chéo, nó hữu ích đến mức nó là tiêu chuẩn HTML5 và có sẵn trên tất cả các trình duyệt.

Đừng bao giờ viết elm.innerHTML+= nữa.

Cải thiện bài viết

Lưu bài viết

  • Đọc
  • Bàn luận
  • Cải thiện bài viết

    Lưu bài viết

    ĐọcinnerHTML property is a part of the Document Object Model [DOM] that is used to set or return the HTML content of an element. Where the return value represents the text content of the HTML element. It allows JavaScript code to manipulate a website being displayed. More specifically, it sets or returns the HTML content [the inner HTML] of an element. The innerHTML property is widely used to modify the contents of a webpage as it is the easiest way of modifying DOM. But there are some disadvantages to using innerHTML in JavaScript.

    Bàn luận

    • ĐọcinnerHTML property is a part of the Document Object Model [DOM] that is used to set or return the HTML content of an element. Where the return value represents the text content of the HTML element. It allows JavaScript code to manipulate a website being displayed. More specifically, it sets or returns the HTML content [the inner HTML] of an element. The innerHTML property is widely used to modify the contents of a webpage as it is the easiest way of modifying DOM. But there are some disadvantages to using innerHTML in JavaScript. The process of using innerHTML is much slower as its contents as slowly built, also already parsed contents and elements are also re-parsed which takes time.
    • Thuộc tính bên trong là một phần của mô hình đối tượng tài liệu [DOM] được sử dụng để đặt hoặc trả về nội dung HTML của một phần tử. Trong đó giá trị trả về đại diện cho nội dung văn bản của phần tử HTML. Nó cho phép mã JavaScript thao tác 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 bên trong được sử dụng rộng rãi để sửa đổi nội dung của trang web vì đây là cách dễ nhất để sửa đổi DOM. Nhưng có một số nhược điểm đối với việc sử dụng bên trong trong JavaScript. The process of using innerHTML is much slower as its contents as slowly built, also already parsed contents and elements are also re-parsed which takes time. The event handlers do not get attached to the new elements created by setting innerHTML automatically. To do so one has to keep track of the event handlers and attach it to new elements manually. This may cause a memory leak on some browsers.
    • Nhược điểm của việc sử dụng thuộc tính bên trong trong JavaScript: The event handlers do not get attached to the new elements created by setting innerHTML automatically. To do so one has to keep track of the event handlers and attach it to new elements manually. This may cause a memory leak on some browsers. Either you add, append, delete or modify contents on a webpage using innerHTML, all contents is replaced, also all the DOM nodes inside that element are reparsed and recreated.
    • Bảo tồn các trình xử lý sự kiện được gắn vào bất kỳ phần tử DOM nào: Trình xử lý sự kiện không được gắn vào các phần tử mới được tạo bằng cách tự động cài đặt InNERHTML. Để làm như vậy, người ta phải theo dõi các trình xử lý sự kiện và gắn nó vào các yếu tố mới theo cách thủ công. Điều này có thể gây rò rỉ bộ nhớ trên một số trình duyệt. Usually, += is used for appending in JavaScript. But on appending to an Html tag using innerHTML, the whole tag is re-parsed. Usually, += is used for appending in JavaScript. But on appending to an Html tag using innerHTML, the whole tag is re-parsed.

      Example:

      Geeks

      title = document.getElementById['#geek'] // The whole "geek" tag is reparsed title.innerHTML += '

      forGeeks

      '
    • Nội dung được thay thế ở mọi nơi: hoặc bạn thêm, nối, xóa hoặc sửa đổi nội dung trên trang web bằng cách sử dụng bên trong, tất cả các nội dung được thay thế, cũng là tất cả các nút DOM bên trong phần tử đó được sửa lại và tái tạo. The old content is replaced even if object.innerHTML = object.innerHTML + ‘html’ is used instead of object.innerHTML += ‘html’. There is no way of appending without reparsing the whole innerHTML. Therefore, working with innerHTML becomes very slow. String concatenation just does not scale when dynamic DOM elements need to be created as the plus’ and quote openings and closings becomes difficult to track. The old content is replaced even if object.innerHTML = object.innerHTML + ‘html’ is used instead of object.innerHTML += ‘html’. There is no way of appending without reparsing the whole innerHTML. Therefore, working with innerHTML becomes very slow. String concatenation just does not scale when dynamic DOM elements need to be created as the plus’ and quote openings and closings becomes difficult to track.
    • Lắp lại vào bên trong không được hỗ trợ: Thông thường, += được sử dụng để nối thêm trong JavaScript. Nhưng khi nối vào thẻ HTML bằng cách sử dụng bên trong, toàn bộ thẻ được sắp xếp lại. There is no proper validation provided by innerHTML, so any valid HTML code can be used. This may break the document of JavaScript. Even broken HTML can be used, which may lead to unexpected problems. There is no proper validation provided by innerHTML, so any valid HTML code can be used. This may break the document of JavaScript. Even broken HTML can be used, which may lead to unexpected problems.
    • Nội dung cũ đã thay thế vấn đề: Nội dung cũ được thay thế ngay cả khi Object.innerhtml = object.innerhtml + ‘html, được sử dụng thay vì object.innerhtml + =‘ html. Không có cách nào để nối thêm mà không lặp lại toàn bộ nội tâm. Do đó, làm việc với InsideHTML trở nên rất chậm. Sự kết hợp chuỗi chỉ không mở rộng khi các thành phần DOM động cần được tạo ra khi cộng với các lỗ mở và trích dẫn và đóng cửa trở nên khó theo dõi. The fact that innerHTML can add text and elements to the webpage, can easily be used by malicious users to manipulate and display undesirable or harmful elements within other HTML element tags. Cross-site Scripting may also lead to loss, leak and change of sensitive information. The fact that innerHTML can add text and elements to the webpage, can easily be used by malicious users to manipulate and display undesirable or harmful elements within other HTML element tags. Cross-site Scripting may also lead to loss, leak and change of sensitive information.

    Example:

     

    Bài Viết Liên Quan

    Chủ Đề