2009-02-17 38 views
18

tôi đã tự hỏi tại sao quảng cáo vẫn sử dụng phương pháp document.write để chèn thêm vào trangTại sao lại sử dụng document.write?

<script language="javascript" type="text/javascript"> 
    document.write("<script type='text/javascript' src='http://addomain/someadd.js'><\/sc" + "ript>"); 
</script> 

Tại sao nó mà tôi không thể chỉ cần đặt

<script type='text/javascript' src='http://addomain/someadd.js'></script> 

Ở vị trí của quảng cáo ?

+1

Vòng kết nối trùng lặp thú vị mà bạn đã thực hiện ở đây. – Ryan

Trả lời

8

Thẻ tập lệnh truyền thống sẽ chặn trang trong khi đang tải và thực thi. Tập lệnh được tải bằng document.write sẽ hoạt động không đồng bộ.Đó là lý do tại sao bạn thấy điều này trên quảng cáo hoặc phân tích, vì các tập lệnh như vậy không ảnh hưởng trực tiếp đến nội dung trang.

+0

Điều đó không đúng, bạn có thể truy cập nội dung của thẻ script được thêm bằng 'document.write' ngay lập tức, miễn là nó từ thẻ tập lệnh mới, trừ khi bạn chỉ định defer = true [Đây là bằng chứng] (https: // jsfiddle.net/mendesjuan/eymsv7qc/) Đó là lý do tại sao bạn sử dụng 'document.write' khi bạn cần thêm một số tham số động vào tập lệnh nhưng không muốn xử lý việc tải async của việc tạo ra một nút script. –

+0

Còn về

2

Tôi đứng sửa chữa, doc.write tạo kịch bản chặn - tồi tệ hơn tôi dù heh :) - nhưng như một avoider adblock nó thực sự yếu, vì vậy tôi chỉ có thể kết luận đó là một cơ chế SOP cho động thêm params yêu cầu tập lệnh bị lạm dụng.

Sử dụng kỹ thuật chèn DOM khi tránh tập lệnh chặn trẻ em.

+0

Đây là những gì tôi nghĩ nhưng xem xét nó làm cho trang rendering chậm hơn trong tất cả các bài kiểm tra của tôi, tôi không thể tin rằng điều này là thực sự đúng sự thật. Các kịch bản nội dòng và thậm chí gắn nó vào DOM theo cách thủ công, tất cả đều tạo ra các trình diễn nhanh hơn (trong document.write thực tế tạo ra một khối signifigant so với phần còn lại). –

+0

@annakata: Bạn có liên kết nào giải thích điều này với nhiều chi tiết hơn không? Tôi cũng có nghi ngờ về "ngăn chặn phá vỡ". –

+0

Không, đó là thứ tôi tham gia một cách chuyên nghiệp - tôi đã thấy đối thủ cạnh tranh gọi kỹ thuật doc.write và giả định nó là một phần của giải pháp chặn (vì phần còn lại của mã phù hợp với mẫu chung). Hóa ra doc.write chỉ là * thực sự * xấu, và tôi đang cho sự cạnh tranh quá nhiều tín dụng :) – annakata

0

Tôi không biết chắc chắn, nhưng họ có thể sử dụng nó để tất cả nội dung trên trang web được tải và hiển thị cho người dùng trước, sau đó quảng cáo được tải và hiển thị.

+0

không - Tôi nghĩ rằng lúc đầu, nhưng doc.write tạo ra các kịch bản * được * chặn – annakata

0

Để phù hợp với regex và để loại bỏ là dễ dàng:

<script type='text/javascript' src='http://addomain/someadd.js'></script> 

nhưng khác là phức tạp hơn và có thể được viết trong các định dạng khác nhau.

Tôi nghĩ đây là lý do.

1

Phương pháp này tránh tải tập lệnh bên ngoài nếu kịch bản hoạt động bị tắt.

+2

nếu kịch bản bị vô hiệu hóa không có kịch bản được tải anyway - ít nhất là trong FF, đã không được thử nghiệm ở nơi khác nhưng tôi tin rằng điều này là đúng – annakata

+0

Ít nhất một số trình duyệt cũ đã làm điều đó. – Gumbo

+0

Vì vậy, bạn có nghĩa là nếu hoạt động kịch bản bị vô hiệu hóa nó ngăn cản các tập tin từ tải? Trường hợp như là nếu nó một thẻ script nó sẽ được nạp (nhưng không được thực thi)? –

5

Tôi làm việc với công ty quảng cáo trên web và từ những gì tôi đã nghe, một số trình duyệt nhất định (không biết những trình duyệt nào) sẽ cho phép bạn thả thẻ tập lệnh vào trang nhưng sẽ không cho phép bạn tự động thực thi nội dung của chúng.

Vì vậy, để tắt tính năng này, bạn cần phải chia thẻ tập lệnh thành nhiều phần để trình duyệt không coi đó là thẻ tập lệnh, mà đúng hơn là bất kỳ Dữ liệu HTML cũ nào. Sau đó, khi DOM được xử lý serially, điều tiếp theo nó đánh giá, sau khi viết ra các thẻ script là ... hey, mà kịch bản thẻ bạn chỉ cần viết ra.

Tại thời điểm này, thẻ tập lệnh được đánh giá và thực thi.

+0

Không chắc chắn tôi nắm bắt điều này. Tôi không thể thấy nó sẽ được đối xử khác đi như thế nào. –

+1

Công ty chúng tôi nhận được mã tương tự từ một công ty quảng cáo. Tôi đồng ý với Paul - về cơ bản nó là một phương pháp làm giảm khả năng kịch bản được lọc/bỏ qua. – Mayo

+1

Tôi cũng nên thêm mã mà chúng tôi đã nhận được tiếp tục làm xáo trộn với việc ghép nối ... "" ... làm cho nó khá rõ ràng đó là những gì họ đang làm. – Mayo

5

Thường thì các tập lệnh được chèn vào tài liệu này có các chuỗi động gắn liền với chúng để thoát khỏi bộ nhớ đệm hoặc gửi một số thông tin về máy khách đến máy chủ quảng cáo. Tôi nghi ngờ ví dụ của bạn bắt đầu như một cái gì đó như thế này

document.write("<script type='text/javascript' src='http://addomain/someadd.js?"+extrastuff+"'><\/sc" + "ript>"); 

nhưng đã được chỉnh sửa theo thời gian hoặc được sao chép và sửa đổi bởi một người không hiểu bit extrastuff. Nhưng như bạn đã viết nó không có sự khác biệt: hai cách bạn trích dẫn trong câu hỏi của bạn có chức năng giống nhau.

0

IMHO, đó không chỉ là vô nghĩa, nhưng thậm chí không chính xác. Dấu ngoặc góc không được thoát, điều này sẽ làm cho tài liệu HTML không hợp lệ về kỹ thuật (mặc dù nó sẽ hoạt động trong tất cả các trình duyệt chính, vì chúng cố gắng phục hồi từ các lỗi của trình lập trình). Và trong trường hợp một người phục vụ trang web của mình với các trang XHMTL là application/xml+xhtml, document.write() sẽ không hoạt động chút nào.

+0

Dấu ngoặc nhọn không cần phải được thoát trong các khối ' ', thường được thoát trong chuỗi là' <\/script>' hoặc '', v.v. Ngoài ra, vì khi nào 'document.write' không hoạt động trong XHTML? – Ryan

+0

@minitech: Bạn sai về cả hai điểm. Trong phần tử XHTML 'script' là [được định nghĩa] (http://www.w3.org/TR/xhtml1/dtds.html#dtdentry_xhtml1-strict.dtd_script) dưới dạng' 'trong DTD - hãy xem bản thân, đó là [PCDATA, chứ không phải CDATA] (http://stackoverflow.com/a/918464/116546). Một thường sử dụng '' thay vì mã hóa thực thể thủ công. Và 'document.write' không tồn tại cho' XMLDocument's, vì vậy nó [không bao giờ làm việc] (http://is.gd/VymCN5) trừ khi bạn đã phục vụ không chính xác XHTML như 'text/html', hướng dẫn trình duyệt xử lý là HTML. – drdaeman

+0

Mặc dù vậy, các trình duyệt có từng xử lý các tài liệu XHTML khác nhau không? (tức là một tài liệu XML?) Đó là tin tức đối với tôi. Dù sao, "dấu ngoặc nhọn không cần phải được thoát trong'