2012-11-27 1 views
1

J'ai un problème étrange avec Phonegap. Mes XMLHttpRequests tirent deux fois; J'utilise XMLHttpRequests dans une application que je développe pour créer une liste dynamique d'événements à sélectionner. jQuery est aussi l'une des libs que j'utilise.Requêtes HTTP dans Phonegap

Chaque fois que j'utilise XMLHttpRequest, soit vanilla soit jQuery, il le fait deux fois, même s'il ne doit être exécuté qu'une seule fois. Est-ce que quelqu'un d'autre a rencontré ce problème?

Quelques exemples de code ici:

(function(){ 
    var request = new XMLHttpRequest(); 
    request.open("GET", "http://{site-url-hidden-for-privacy}/events/list", true); 
    request.onreadystatechange = function(){ 
    if(request.readyState == 4){ 
     if(request.status == 200 || request.status == 0){ 
      parse_events(JSON.parse(request.responseText)); 
     }    
    } 
} 
request.send(); 
})(); 

le texte XMLHttpResponse est un tableau JSON, et parse_events prend simplement ce tableau et l'utilise pour créer un ensemble d'options de sélection pour un menu.

Est-ce que quelqu'un sait pourquoi cela se déclencherait deux fois, créant essentiellement deux options pour chaque événement, alors qu'il devrait y en avoir une seule?

+0

Comment vérifiez-vous que le module onreadystathange se déclenche deux fois? Deux demandes identiques retournant une fois chacune pourraient ressembler beaucoup. –

+0

Désolé, peut-être que je n'étais pas super clair, mais ce qui semble se passer, c'est que la fonction anonyme ci-dessus se déclenche deux fois, c'est-à-dire deux requêtes identiques retournant une fois chacune. – Goldentoa11

Répondre

4

D'accord, je l'ai compris. Je travaillais sur ce projet avec un collègue, et nous avons oublié d'écouter l'événement deviceready à feu, car nous utilisons Phonegap. Nous lions les événements "en ligne" et "hors ligne" lorsque la fenêtre était chargée, pas lorsque l'appareil était prêt.

Avant:

document.addEventListener("DOMContentLoaded", function(){ 
    document.addEventListener("online", function(){...}, false); 
    document.addEventListener("offline", function(){...}, false); 
}, false); 

Solution:

document.addEventListener("DOMContentLoaded", function(){ 
    document.addEventListener("deviceready",function(){ 
     document.addEventListener("online", function(){...}, false); 
     document.addEventListener("offline", function(){...}, false); 
    },false); 
}, false); 

Je ne sais pas pourquoi, car il n'a pas de sens total, mais je ne crois pas passer par "deviceready" était à l'origine du Demande HTTP pour aller deux fois, une fois lorsque la page chargée, et une fois lorsque l'appareil était prêt.

Le correctif était de le faire seulement lorsque l'appareil était prêt, comme indiqué ci-dessus.

+0

bon monsieur. vous avez résolu mon problème. Merci aussi. –