2010-02-25 7 views
0

J'ai une liste déroulante qui se remplit elle-même en fonction de la valeur d'une autre liste déroulante, en utilisant la qualité ajax de jQuery. Je le fais avec le $ (document) fonction .ready, avec ce qui est le code approprié ...jQuery SelectedItem Population

$(document).ready(function() { 
    populateFirstDropDownBox(); 

    $("#firstBox").change(function() { 
    populateSecondDropDownBox($("#firstBox option:selected").val()); 
    }); 

    // Do this on initial page load to populate second box 
    populateSecondDropDownBox($("#firstBox option:selected").val()); 
}); 

Cela fonctionne très bien dans Firefox et IE, mais pas dans Chrome. Chrome ne semble pas remplir immédiatement la première liste déroulante de sorte que $ ("# firstBox option: selected"). Val() finit par ne pas résoudre.

Quelle est la meilleure façon de s'assurer que Chrome a rempli la liste déroulante?

Edit: a ajouté plus

function populateFirstDropDownBox() { 
    $.post("ajax/getFirstBox", function(json) { 
    var options = makeOptionList(json); 
$("#firstBox").html(options); 
$("#firstBox").triggerHandler("change"); 
    }) 
} 

function populateSecondDropDownBox(firstBox) { 

    $.post("ajax/getSecondBox", {firstBox: firstBox}, function(json) { 
    var options = makeOptionList(json); 
$("#secondBox").html(locationOptions); 
$("#secondBox").triggerHandler("change"); 
    }) 
} 

function makeOptionList(json) { 
    data = eval(json); 
    var options = ""; 

    for (var optIndex = 0; optIndex < data.length; ++optIndex) { 
    options += "<option value='" + data[optIndex].value + "'>" + data[optIndex].key + "</option>" 
    } 

    return options; 
} 

Répondre

0

Retirez ceci:

// Do this on initial page load to populate second box 
populateSecondDropDownBox($("#firstBox option:selected").val()); 

Depuis ce code:

$("#firstBox").triggerHandler("change")  

déclenche une fois la première liste déroulante est chargé.

Mieux encore, remplissez vos listes déroulantes dans le code HTML sur le serveur et économisez deux allers-retours. Vos utilisateurs l'apprécieront.

+0

Vrai, mais j'ai toujours mon problème initial ("Option #firstBox: selected") ne se remplit pas immédiatement dans Chrome. Fonctionne comme un charme dans IE et Firefox. Toutefois, dans Chrome, puisque cette valeur n'est pas encore définie, populateSecondDropDownBox échoue. Je suppose que je cherche juste un moyen de forcer Chrome à peupler l'élément firstBox. – majorpayne27

+0

Vous effectuez une demande asynchrone pour charger les données. Firefox et IE peuvent le charger assez rapidement pour qu'il semble immédiat, mais ce n'est pas le cas. Lorsque vos utilisateurs essaient de charger la page, ils ont une latence plus longue entre eux et le serveur et rencontrent le même problème dans n'importe quel navigateur. La façon dont vous avez structuré votre code, vous devez faire tout le traitement de la 2ème case dans le gestionnaire de réponse Ajax pour qu'il fonctionne de manière cohérente. – noah