2010-06-29 5 views
2

Mon code essaie de repeupler les options et de sélectionner un élément. Les problèmes sont remplis le lot de tâche et repeuple 3 cases de sélection. Mon contrôle de méthode revient mais quand j'essaie de sélectionner, les options ne sont pas encore remplies. Cela arrive parfois avec des systèmes/navigateurs plus lents. (Et spécifiquement sur IE) Y at-il un moyen d'empêcher cela en utilisant jQuery ou quelque chose? Y at-il un événement déclenché par le navigateur lorsque toutes les options sont chargées/ou sont en cours de chargement. Cela semble parce que le navigateur prend parfois du temps pour afficher les options mais les contrôles de méthode sont retournés.traitant du retard dans le remplissage des options de sélection

function myMethod() { 
    populateOptions(); 
    if(document.getElementById('Id').options[index].text==existId){ 
     $("#Id").val(existId); 
    } 
} 

function populateOptions() { 
//Make ajax call 
    // repopulates options 
} 
+1

Veuillez poster le code AJAX. – joshperry

Répondre

1

Depuis les appels AJAX sont asynchrones par défaut, vous devez déplacer votre affectation de valeur pour exécuter après le code qui renseigne votre select. Sinon, l'affectation de valeur se produit avant que la réponse ne revienne.

Je suppose que tout code remplit le select est configuré pour exécuter après la réponse est reçue. Donc placer votre sélection de valeur après ce code devrait résoudre le problème.

(En d'autres termes, il ira à l'intérieur la fonction populateOptions().)

Au-delà, il est difficile d'offrir une solution sans voir votre code.


EDIT: Voici quelques exemples de la façon dont cela pourrait fonctionner. N'importe lequel d'entre eux sera mieux que le réglage async: false dans la demande.

Vous pouvez placer le code qui doit attendre la réponse à l'intérieur de le rappel success:.

function populateOptions() { 
    $.ajax({ 
     url: "some/path", 
     success: function(resp) { 
      // Place ANY code that needs to wait for the response in here. 
      // This way it will not run until the successful response is received. 
     } 
    }); 
} 

Ou vous pouvez placer le code qui doit attendre la réponse dans une autre fonction, et appeler cette fonction à l'intérieur du rappel success:.

function populateOptions() { 
    $.ajax({ 
     url: "some/path", 
     success: function(resp) { 
       // Call this function when the successful response is received. 
      successFunction(resp); 
     } 
    }); 
} 
function successFunction(resp) { 

    // Place ANY code that needs to wait for the response in here. 

} 

Ou, disent si populateOptions() devraient être utilisées de différentes façons, si vous avez besoin d'un rappel différent, vous pouvez passer une fonction d'une autre fonction qui sera appelée dans la fonction de rappel success:.

function myMethod() { 
     // Send a function as an argument when you call populateOptions() 
    populateOptions(function(resp){alert(resp);}); 

    // Code that does NOT need to wait can still go here 
} 
function populateOptions(callback_fn) { // Receive the function that was sent 
    $.ajax({ 
     url: "some/path", 
     success: function(resp) { 
       // Call the function that was sent 
      callback_fn(resp); 
     } 
    }); 
} 

Ou prendre le même exemple que ci-dessus, vous pouvez réellement utiliser la fonction que vous avez passé dans comme le rappel success:.

function myMethod() { 
     // Send a function as an argument when you call populateOptions() 
    populateOptions(function(resp){alert(resp);}); 

    // Code that does NOT need to wait can still go here 
} 
function populateOptions(callback_fn) { // Receive the function that was sent 
    $.ajax({ 
     url: "some/path", 
     success: callback_fn(resp) // Now the function passed is the callback 
    }); 
} 
+0

oui. Comme vous l'avez dit, une fois que nous recevons la réponse, nous remplissons select et c'est à l'intérieur de populateOptions(). Donc, le contrôle de retour populateOptions() sur toutes les opérations est terminé. Mais parfois, le navigateur prend du temps pour remplir les options. Ceci est en accord avec le navigateur. Si le navigateur le fait rapidement, cela fonctionne. –

+1

@Jigar - Vous avez dit * "populateOptions() le contrôle de retour sur toutes les opérations est terminé" *, mais ce n'est pas vrai quand il s'agit d'une requête AJAX.Une requête AJAX (par défaut) laisse le code continuer à s'exécuter avant même d'avoir reçu une réponse. Le contrôle est donc renvoyé avant que les options ne soient remplies. C'est une situation courante. Essayez simplement de déplacer votre code qui sélectionne une valeur dans 'populateOptions()' juste après le code qui le remplit. Ou éditez votre question avec le code de 'populateOptions()'. – user113716

+0

@Jigar - Ce problème a-t-il été résolu? – user113716

Questions connexes