2011-12-29 185 views
0

我有一個擴展程序,用於從Facebook上的用戶新聞源中刪除應用程序。Chrome擴展程序加載Javascript

在擴展JS中,我編程式地包含一個用於統計跟蹤的<script>標記。基本上看有多少人使用該應用程序,從哪些國家等。

問題是,當用戶在Facebook上,跟蹤腳本將只加載一次。而且,當用戶瀏覽Facebook時,除非手動刷新頁面,否則不會再次加載。

這是我的內容腳本中的代碼。

$(document).ready(function() { 
// Include stats tracking 
(function(d){ 
    var trackingjs, id = 'stats'; if (d.getElementById(id)) {return;} 
    trackingjs = d.createElement('script'); trackingjs.id = id; trackingjs.async = true; 
    trackingjs.src = "tracking_url"; 
    d.getElementsByTagName('body')[0].appendChild(trackingjs); 
}(document)); 
} 

我包含jQuery,因爲我使用jQuery作爲我的插件。除非用戶手動刷新頁面,否則一切都可以正常工作,除了只包含一次腳本並且不會再包含它。

這與Facebook有關嗎?

回答

-1

除了結合的document.ready,你也可以運行每個Ajax完整的跟蹤功能(因爲很可能這就是由Facebook的當用戶瀏覽被觸發:Ajax請求,而不是新的頁面請求):

function tracker() { 

// Include stats tracking 
(function(d){ 
    var trackingjs, id = 'stats'; if (d.getElementById(id)) {return;} 
    trackingjs = d.createElement('script'); trackingjs.id = id; trackingjs.async = true; 
    trackingjs.src = "tracking_url"; 
    d.getElementsByTagName('body')[0].appendChild(trackingjs); 
}(document)); 
} 


$(document).ready(tracker); 
$(document).ajaxComplete(tracker); 
+0

感謝。我沒有嘗試ajaxComplete,但也沒有工作。 – GV1 2011-12-29 18:38:11

+0

'ajaxComplete'不能在擴展上下文中工作,因爲它是頁面本身的一個不同的jQuery實例 - 所以頁面的AJAX不會觸發這個。 – Xan 2016-09-26 15:42:26

0

要瀏覽網頁,甚至通過AJAX,用戶點擊的頁面,所以你可以嘗試聽單擊文檔的事件,並檢查的location.hash改變

var currentLocation=location.href; 
document.addEventListener('click', function(){ 
    if(location.href == currentLocation){ 
    return; 
    } 
    currentLocation = location.href 
    // run here your tracking code 
}); 

,並確保您的代碼允許無需重新加載頁面即可多次運行它,現在它不會(Facebook不會替換頁面導航上的文檔,所以跟蹤函數第二次調用d.getElementById(id)將不會是空的,並且將執行返回)。

你可以做這樣的:

function (d){ 
    var trackingjs, id = 'stats'; if (d.getElementById(id)) {return;} 
    trackingjs = d.createElement('script'); trackingjs.id = id; trackingjs.async = true; 
    trackingjs.src = "<url>"; 
    d.getElementsByTagName('body')[0].appendChild(trackingjs); 
    trackingjs.onload = (function(trackingjs){ 
     trackingjs.parentNode.removeChild(trackingjs); 
    })(trackingjs) 
}; 
相關問題