Как мне решить эти проблемы? - PullRequest
0 голосов
/ 17 июля 2011

Я написал простейшее расширение в качестве упражнения в JS-кодировании. Это расширение проверяет, подключен ли какой-либо пользователь (определенной социальной сети) к сети, а затем выводит его / ее маленькое изображение, имя и статус в сети в уведомлении об уведомлении. Он проверяет страницу профиля каждые 2 минуты через (setTimeout), но когда пользователь переходит в режим «онлайн», я устанавливаю setTimeout на 45 минут (чтобы избежать онлайн-предупреждений каждые 2 минуты).

Это работает, но не совсем так, как я ожидал. У меня 2 вопроса:

1) Когда определенный пользователь находится в сети, и я изменяю идентификатор пользователя (через страницу параметров), чтобы проверить другого, это не происходит, потому что он ждет 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 Ответ

1 голос
/ 17 июля 2011

В опциях вместо clearTimeout(bg.id1); попробуйте bg.clearTimeout(bg.id1);

Поскольку проблема с изображением выглядит так, будто вы никогда не очищаете массив imgarres, только добавляя к нему элементы, а затем выбирая первый.

PS.Ваш код очень трудно читать, возможно, если вы сделали его хорошо отформатированным и не использовали загадочные имена переменных, вы могли бы легче находить ошибки.

ОБНОВЛЕНИЕ

Я думаю, я знаю, в чем проблема.Когда вы устанавливаете время ожидания, вы используете локальную переменную области видимости из-за ключевого слова var, поэтому ваш id1 виден только внутри этой функции, а глобальный id1 по-прежнему undefined.Поэтому вместо:

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

try:

id1 = setTimeout(getdata, 60000*45);

Из-за этого if(bg.id1){} внутренние параметры никогда не выполняются.

(bg.clearTimeout(bg.id1); должно работать после этого, но это не нужно, так как вы все равно очищаете тайм-аут внутри getdata()

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...