2011-07-17 75 views
0

我寫了最簡單的擴展作爲JS編碼的練習。此擴展程序會檢查某個用戶(某個社交網絡)是否在線,然後在通知警報中輸出他/她的小圖片,姓名和在線狀態。它通過(setTimeout)每2分鐘檢查一次配置文件頁面,但當用戶變爲「在線」時,我將setTimeout設置爲45分鐘(以避免每2分鐘發出一次在線警報)。我如何解決這些問題?

它的工作原理,但不完全如我所料。我有兩個問題:

1)當某個用戶在線,我更改用戶ID(通過選項頁)來檢查另一個,它不會發生,因爲它等待45分鐘或更少。我嘗試了下面的代碼(在options.html中),但它沒有幫助。

2)當我改變用戶,圖像輸出不能正常工作!它輸出以前用戶的圖像!

我該如何解決這些問題? 謝謝!

options.html

<script> 

    onload = function() { 
    if (localStorage.id){ 
    document.getElementById("identifier").value = localStorage.id; 
    } 

    else { 
    var el = document.createElement("div"); 
    el.innerHTML = "Enter ID!!"; 
    document.getElementsByTagName("body")[0].appendChild(el); 

    } 

    }; 

    function onch(){ 

localStorage.id = document.getElementById("identifier").value; 
var bg = chrome.extension.getBackgroundPage(); 
if(bg.id1){ 
clearTimeout(bg.id1); 
bg.getdata(); 
} 



    } 
</script> 
<body> 
<h1> 

</h1> 
<form id="options"> 
<h2>Settings</h2> 


    <label><input type='text' id ='identifier' value='' onchange="onch()"> Enter ID </label> 
</form> 
</body> 
</html> 

backg.html

<script type="text/javascript"> 
var domurl = "http://www.xxxxxxxxxxxxxx.xxx/id"; 


var txt; 
var id1; 
var id2; 
var imgarres = []; 
var imgarr = []; 
var imgels = []; 


function getdata() { 
    if (id1){clearTimeout(id1);} 
    if (id2){clearTimeout(id2);} 

    var url = getUrl(); 

    var xhr = new XMLHttpRequest(); 
    xhr.open('GET',url, true); 
    xhr.setRequestHeader('Cache-Control', 'no-cache'); 
    xhr.setRequestHeader('Pragma', 'no-cache'); 

    xhr.onreadystatechange = function() { 
     if (xhr.readyState == 4) { 
     txt = xhr.responseText; 
     var r = txt.indexOf('<b class="fl_r">Online</b>'); 
     var el = document.createElement("div"); 
     el.innerHTML = txt; 
     var n = imgprocess(el,url);  
     var nam = el.getElementsByTagName("title")[0].innerHTML; 
      if (r != -1) { 
      var notification = webkitNotifications.createNotification(n, nam, 'online!!'); 
      notification.show(); 
      var id1 = setTimeout(getdata, 60000*45); 


      } 
      else { 

      var id2 = setTimeout(getdata, 60000*2); 
      } 


    }} 

    xhr.send(); 

} 


function imgprocess(text,url){ 
imgels = text.getElementsByTagName("IMG"); 
for (var i=0;i< imgels.length;i++){ 
if (imgels[i].src.indexOf(parse(url)) != -1){ 
    imgarr.push(imgels[i]); 


} 


} 
for (var p=0; p< imgarr.length; p++){ 
if (imgarr[p].parentNode.nodeName=="A"){ 
    imgarres.push(imgarr[p]); 


} 
} 
var z = imgarres[0].src; 

return z; 
} 

function getUrl(){ 
if (localStorage.id){ 
var ur = domurl + localStorage.id; 
return ur; 
} 
else { 
var notif = webkitNotifications.createNotification(null, 'blah,blah,blah', 'Enter ID in options!!'); 
notif.show(); 
getdata(); 
} 
} 


function init() { 

getdata(); 


} 
</script> 
</head> 
<body onload="init();"> 

</body> 
</html> 

回答

1

在選擇權,而不是clearTimeout(bg.id1);嘗試bg.clearTimeout(bg.id1);

對於形象問題看起來你從來沒有乾淨imgarres陣列,只添加元素它然後採取第一個。

PS。你的代碼非常難以閱讀,也許如果你把它設計得很好並且沒有使用神祕的變量名,你就可以更容易地發現錯誤。

UPDATE

我想我知道是什麼問題。在設置超時時,由於var關鍵字使用了本地範圍變量,所以您的id1僅在此功能中可見,並且全局id1仍爲undefined。因此,而不是:

var id1 = setTimeout(getdata, 60000*45); 

嘗試:

id1 = setTimeout(getdata, 60000*45); 

因爲這裏面if(bg.id1){}選項從不執行。

bg.clearTimeout(bg.id1);後,應該工作,但是當你正在清理超時內getdata()反正不需要的話)

+0

謝謝!但是bg.clearTimeout(bg.id1);沒有工作.. – DrStrangeLove

+0

@DrStrangeLove查看更新。 – serg

+0

非常感謝,serg !! :)你是天才!有效!!我的最後一個問題 - 我如何清潔imgarres數組? – DrStrangeLove