2010-04-01 21 views
9

Điều gì xấu xảy ra vào lúc này document.write() được gọi?Những gì thiệt hại được thực hiện bởi document.write()?

Tôi đã nghe các bit và mẩu về document.write có tác động bất lợi đến DOM hoặc sử dụng thư viện Javascript. Tôi có một vấn đề trước mặt tôi rằng tôi nghi ngờ có liên quan, nhưng đã không thể tìm thấy một bản tóm tắt ngắn gọn về những gì thiệt hại phương pháp nào.

Trả lời

13

Sử dụng document.write() sẽ phá vỡ trang web - phá hủy và ghi đè toàn bộ DOM - nếu nó được gọi sau khi tài liệu đã hoàn thành được phân tích cú pháp. Điều này được coi là sử dụng kém của document.write() và là/là lý do cho những lời chỉ trích của rất nhiều tập lệnh cũ hơn.

window.onload = function() 
{ 
    document.write("Oops!"); 
} 

Nói chung mặc dù, đó là chấp nhận được và thay vì sử dụng rộng rãi tại phân tích thời gian để thêm một cái gì đó tự động đến trang một cách đồng bộ:

<div> 
    <script type="text/javascript"> 
    document.write("Well I'll be, your browser supports JavaScript!"); 
    </script> 
</div> 

Nó chủ yếu được sử dụng bởi dịch vụ xuất bản quảng cáo để thêm các quảng cáo vào một trang, một số API của Google cũng sử dụng nó.

7

Chặn trang, đủ hoặc lý do khi được sử dụng không đúng cách.

Khi bạn làm document.write, như Andy đã nói, đó là đồng bộ có nghĩa là bạn phải đợi nó trước khi tiếp tục với phần còn lại của trang.

Tôi không muốn trang web của bạn bị treo máy chỉ vì máy chủ quảng cáo của bạn ngừng hoạt động. Thật không may, đây là trường hợp với SO, các quảng cáo trên quyền sử dụng document.write sử dụng một kịch bản từ một máy chủ khác, nếu xuống, khối trang tải cho đến khi nó lần ra. Sự chậm trễ này, do máy chủ quảng cáo chậm (thường là bên thứ ba) là đến nay quá thường xuyên khiến trang web tải chậm.

Rant bên: Quảng cáo giúp bạn kiếm tiền từ lượt xem, tốt, bạn cần kiếm sống. Nhưng không được phụ thuộc vào về chúng từ góc độ kỹ thuật, như trong máy chủ của họ bị hỏng, trang web của bạn là FUBAR ... làm quảng cáo theo cách không chặn, có nhiều cách ngoài document.write để đạt được điều này.

+0

Vâng tôi đã chán ngấy của các quảng cáo trên đây ngăn chặn các phần còn lại của trang, vì vậy bây giờ tôi có '127.0.0.1 ads.stackoverflow .com' trong tệp lưu trữ của tôi –

+0

+1 cho lệnh rant bên, 'ads.stackoverflow.com' dường như gặp sự cố thường xuyên (chủ yếu là các buổi sáng GMT). Không sử dụng tốt nhất 'document.write'. :-) –

+0

Tôi đã viết một thư viện cho phép bạn tải các tập lệnh document.write async: http://github.com/iamnoah/writeCapture – noah

2

Tôi chỉ muốn thêm fiddle để hiển thị ví dụ trực tiếp về ý nghĩa của Andy E.

Về cơ bản, phần tử đoạn văn sẽ không hiển thị nữa vì document.write() ghi đè nó.

0

đoạn này sẽ chứng minh điều đó:

window.onload = function() { 
 
    document.write("Because I will overwrite everything."); 
 
}
<p>Hello, I won't render anymore.</p>

Các vấn đề liên quan