2009-07-31 37 views
15

Có ai biết tại sao Google Analytics yêu cầu hai thẻ tập lệnh riêng biệt không?Hai thẻ tập lệnh riêng biệt cho Google Analytics?

Cụ thể, hướng dẫn họ tư vấn cho người dùng để nhúng các đoạn mã sau đây vào một trang web cho mục đích theo dõi:

<!-- Google Analytics --> 
<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-8720817-1"); 
pageTracker._trackPageview(); 
} catch(err) {}</script> 

Tại sao người dùng không thể chỉ sử dụng một khối kịch bản như thế này:

<!-- Google Analytics --> 
<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")); 
try { 
var pageTracker = _gat._getTracker("UA-8720817-1"); 
pageTracker._trackPageview(); 
} catch(err) {}</script> 

Trả lời

18

<script> thẻ được thực thi 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).

0

Tôi nghi ngờ đó là một nỗ lực để tránh các vấn đề trình duyệt tối nghĩa với việc sử dụng document.write để triển khai thẻ tập lệnh.

+5

Tôi nghi ngờ nó tối nghĩa; Tôi tin rằng các trình duyệt sẽ chỉ phân tích cú pháp thẻ văn bản lệnh sau khi khối tập lệnh hiện tại kết thúc ... Một số việc cần làm với thực thi javascript đơn luồng có thể dự đoán được ... – Stobor

+1

@Stobor: Bạn nên viết câu trả lời đó. Tôi sẽ bầu cho nó. :) – chaos

0

Đối với những gì đáng giá, chúng tôi sử dụng đáng kể cơ chế onclick = "pageTracker._trackPageview (% filename%)" để theo dõi tải xuống tệp trực tiếp nhưng vẫn không muốn theo dõi số lần xem trang thực tế cho đến khi trang hoàn toàn nạp vào. Chúng tôi phải bao gồm thẻ thứ nhất ở đầu trang để bật điều đó, nhưng để lại lệnh gọi _trackPageview() cuối cùng ở cuối (vâng, chúng tôi cũng có nhiều bit var pageTracker).

Không nhất thiết phải lý do tại sao chúng phá vỡ theo cách đó, nhưng nó giúp việc này dễ dàng hơn một chút cho mục đích của chúng tôi.

+0

Bạn có thể đặt tất cả mã ở dưới cùng và đặt trình xử lý onclick trong mã ngay sau đó. – Draemon

1

Khối đầu tiên thực sự đang sử dụng JavaScript để viết toàn bộ thẻ tập lệnh mới nội dòng để thay thế thẻ tập lệnh đó. Đó là kiểm tra xem bạn có đang sử dụng "https" trên trang đang được yêu cầu không và nếu có, hãy sử dụng url an toàn của họ để yêu cầu tập lệnh hoặc trình duyệt của bạn có thể hiển thị "Các phần của trang này không an toàn - hiển thị bảo mật mặt hàng?" hoặc từ chối thực hiện cuộc gọi.

Nếu thẻ tập lệnh thứ hai được bao gồm trong thẻ đầu tiên, thẻ này sẽ bị thổi bay và/hoặc không phải là thẻ tập lệnh được tạo đúng và mã của bạn sẽ phải xen kẽ với thẻ của chúng.

Bằng cách này, bạn chỉ có thể thực hiện tất cả các cuộc gọi đến trackPageView và đặt thuộc tính, v.v. trong các khối của riêng bạn một cách sạch sẽ và vẫn hoạt động bình thường trên http và https.

Vì vậy, khi trang này hiển thị, DOM sẽ trông như thế này sau khi kịch bản đầu tiên thực hiện (thường xuyên http):

<!-- Google Analytics --> 
<script src='http://www.google-analytics.com/ga.js' type='text/javascript'></script> 

<script type="text/javascript"> 
try { 
var pageTracker = _gat._getTracker("UA-8720817-1"); 
pageTracker._trackPageview(); 
} catch(err) {}</script> 

Và đây (https):

<!-- Google Analytics --> 
<script src='https://ssl.google-analytics.com/ga.js' type='text/javascript'></script> 

<script type="text/javascript"> 
try { 
var pageTracker = _gat._getTracker("UA-8720817-1"); 
pageTracker._trackPageview(); 
} catch(err) {}</script> 

Thông tin chi tiết: http://code.google.com/apis/analytics/docs/tracking/gaTrackingOverview.html

5

document.write xảy ra ngay sau khi mã được thực thi. Vì vậy, nếu chúng tôi sử dụng "một kịch bản khối" của bạn ví dụ, mã nguồn được tạo ra thực tế sẽ kết thúc như thế này:

<!-- Google Analytics --> 
<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")); 
try { 
var pageTracker = _gat._getTracker("UA-8720817-1"); 
pageTracker._trackPageview(); 
} catch(err) {}</script> 
<script src='http://www.google-analytics.com/ga.js' type='text/javascript'></script> 

Do đó mã var pageTracker = _gat._getTracker("UA-8720817-1"); pageTracker._trackPageview(); sẽ thất bại vì _gat sẽ không được xác định cho đến khi tệp tin ga.js Nó đã nạp đầy.

Điều đó có hợp lý không?

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