2011-07-17 23 views
0

私は、JSコーディングの練習として最も簡単な拡張を書いています。この拡張機能は、(特定のソーシャルネットワークの)一部のユーザがオンラインであるかどうかをチェックし、通知警告で小さな画像、名前、オンラインステータスを出力します。 (setTimeout)で2分ごとにプロフィールページをチェックしますが、ユーザーが「オンライン」になると、setTimeoutを45分に設定します(2分ごとのオンラインアラートを避けるため)。どうすればこれらの問題を解決できますか?

これはうまく動作しますが、期待通りのものではありません。

1)特定のユーザーがオンラインで、別のユーザーID(オプションページを介して)を変更して、45分以下の待ち時間があるためにユーザーIDが変更されても起こりません。私は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); 

試してみてください。このためif(bg.id1){}内部オプションの

id1 = setTimeout(getdata, 60000*45); 

が実行されることはありません。

bg.clearTimeout(bg.id1);はその後動作するはずですが、あなたはgetdata()内でタイムアウトをクリアしているとして、それがとにかく必要とされていない)

+0

感謝!!しかし、bg.clearTimeout(bg.id1); – DrStrangeLove

+0

@DrStrangeLoveアップデートを参照してください。 – serg

+0

ありがとう、serg !! :)あなたは天才です!出来た!!私の最後の質問 - どのように私はimgarresアレイをきれいにするのですか? – DrStrangeLove