2010-06-06 29 views
10

Chỉnh sửa: Như Andrew Moore chỉ ra câu hỏi này là một bản sao của Two separate script tags for Google Analytics? Vì vậy, câu hỏi này nên được xóa để tránh lộn xộn Stack Overflow, trừ khi có một điểm trong việc giữ này, vì nó có thể sẽ hiển thị trong tìm kiếm hơi khác nhau.Sự khác biệt nào khi sử dụng một số khối tập lệnh trên trang web?

Điều gì tạo nên sự khác biệt khi sử dụng nhiều khối tập lệnh trên một trang web? Tôi đã dán mã tiêu chuẩn để bao gồm Google Analytics làm ví dụ và tôi đã thấy cùng một mẫu được sử dụng ở những nơi khác. Tại sao mã này được tách thành hai khối tập lệnh riêng biệt thay vì chỉ sử dụng một khối duy nhất?

<script type="text/javascript"> 
    var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www."); 
    document.write(unescape("%3Cscript src='" + gaJsHost + "google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E")); 
</script> 
<script type="text/javascript"> 
    try{ 
     var pageTracker = _gat._getTracker("UA-xxxxxx-x"); 
     pageTracker._trackPageview(); 
    } catch(err) {} 
</script> 
+0

Tôi biết mã GA chỉ là một ví dụ, nhưng tôi nghĩ rằng thẻ đó có thể đáng giá, ví dụ: cho những người đang tìm kiếm cùng một thứ. –

+0

Sao chép. Tôi biết rằng tôi đã trả lời cùng một câu hỏi trước ... – Guffa

+1

bản sao có thể có của [Hai thẻ tập lệnh riêng biệt cho Google Analytics?] (Http://stackoverflow.com/questions/1210034/two-separate-script-tags-for- google-analytics) –

Trả lời

5

Thứ hai <script> chứa mã phụ thuộc vào google-analytics.com/ga.js tải.

Tập lệnh không được hoãn lại được thực hiện theo thứ tự chúng tồn tại trong DOM.

Các <script> đầu tiên tiêm mới <script> sau khi bản thân (với src trỏ đến ga.js google) mà ngay lập tức tải và thực thi - chỉ sau đó không thứ hai <script> được thực thi.

+0

+1 Tôi đã nhận được nó ngay bây giờ, sau khi đọc nó hai lần, xấu của tôi. – Ben

2

Trong ví dụ của bạn, khối kịch bản đầu tiên sử dụng document.write để viết một yếu tố kịch bản, mà tải một kịch bản bên ngoài, và sau đó là yếu tố kịch bản thứ hai sử dụng điều quy định tại rằng kịch bản bên ngoài. Tôi khá chắc chắn rằng việc chia nó thành hai khối tập lệnh là cần thiết để nó hoạt động.

Nếu bạn không sử dụng thủ thuật kỳ quặc như vậy, việc đặt nhiều khối tập lệnh liên tiếp thường sẽ không làm gì đặc biệt. Có chúng trong các phần khác nhau của trang là hữu ích là khi bạn muốn các tập lệnh chạy trong khi tài liệu đang tải. Nếu trang của bạn rất dài, bạn có thể muốn một số tập lệnh chạy trong khi nó vẫn đang tải, để khởi tạo mọi thứ càng sớm càng tốt. Thay thế các yếu tố với các vật dụng nên được thực hiện càng sớm càng tốt để tránh những thứ nhảy xung quanh khi trang cuối cùng kết thúc tải.

1

Nếu mã trong các khối đầu tiên kết thúc bằng ngoại lệ, phần thứ hai cũng sẽ hoạt động.

+0

True! Có lẽ không phải lý do tại sao Google đã làm điều đó (một khối 'try' sẽ giải quyết điều đó), nhưng đó là một điểm hoàn toàn hợp lệ ... –

+1

-1: Không phải lý do tại sao tất cả điều này được phân tách thành hai khối. Và những gì bạn đang mô tả là thực hành xấu (nó bật lên hộp thoại lỗi kịch bản trên IE). –

+0

Andrew: Lý do rác rưởi cho một downvote. Câu hỏi ban đầu có hai phần: "Sự khác biệt nào khi sử dụng nhiều khối tập lệnh trên một trang web?" và câu hỏi về mã Google. Câu trả lời này có thể không giải quyết phần thứ hai nhưng chắc chắn giải quyết phần đầu tiên và là cái gì đó mà tôi không nghĩ là được biết đến rộng rãi và không được đề cập bởi các câu trả lời khác, vì vậy tôi nói nó rất hữu ích và có liên quan. –

5

<script> thẻ được thực hiện theo trình tự. Một khối <script> không thể thực thi nếu khối trước đó không được thực thi.

Thẻ <script> đầu tiên chịu trách nhiệm tạo thẻ Google <script> sẽ tải các thẻ j bên ngoài. Sau khi <script> đầu tiên được hoàn tất thi công, DOM trông giống như sau:

<script></script> <!-- First Script Tag --> 
<script></script> <!-- Google Injected Script --> 
<script></script> <!-- Second Script Tag --> 

Điều này đảm bảo rằng thứ hai <script> thẻ sẽ không thực hiện cho đến khi .js được thực hiện tải. Nếu <script> đầu tiên và thứ hai sẽ được kết hợp, điều này sẽ gây ra biến số _gat không được xác định (do tập lệnh được chèn của Google sẽ không bắt đầu tải cho đến khi tập lệnh đầu tiên được thực hiện xong).

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