2010-01-09 8 views
25

J'ai un champ select qui est rempli dynamiquement avec un appel ajax qui renvoie simplement toutes les options de sélection HTML. Voici la partie du PHP qui ne fait qu'échouer les balises select et remplit dynamiquement chaque option/valeur.La fonction Jquery .change() ne fonctionne pas avec la liste SELECT remplie dynamiquement

echo "<select name='player1' class='affector'>"; 
echo "<option value='' selected>--".sizeof($start)." PLAYERS LOADED--</option>"; 

foreach ($start as $value) { 
    echo "<option value='".$value."'>".$value."</option>"; 
} 
    echo "</select>"; 
} 

Après cette liste est remplie, je suis en train d'appeler un événement de changement, de sorte que chaque fois que l'option par défaut est modifiée dans la liste SELECT ou dans un champ de texte avec la même classe, il désactive un bouton radio définir dans une autre partie du formulaire. (Vous pouvez voir la première question, j'ai demandé d'obtenir cette partie de la fonctionnalité de travail here)

$('.affector').change(function(){ 
     $(this).parents('tr').find('input:radio').attr('disabled', false); 
}); 

Pour une raison quelconque, même si je donne le champ sélectionnez le nom de la classe appropriée (affecteur), lorsque je sélectionne des options différentes sur le terrain, les autres parties du formulaire ne sont pas désactivées. Le champ de texte statique avec la même classe fonctionne correctement. Je suis perplexe.

Des idées?

+3

pointe rapide, au lieu de'echo ', essayez:' echo "< valeur de l'option = '$ value'> "'. Si vous accédez à un tableau, vous pouvez faire 'echo"

Répondre

20

Juste un commentaire sur votre dernière question ... Voici ce que je dis:

Utiliser jQuery lier

function addSelectChange() { 
    $('select').bind('change', function() { 
     // yada yada 
    }); 
} 

Appel addSelectChange dans votre fonction ajax succès. Cela devrait faire l'affaire. Jetez aussi un coup d'œil sur l'événement live jQuery (lorsque vous souhaitez définir des événements pour tous les éléments DOM actuels et futurs dans un projet ultérieur ou quelque chose de ce genre). Malheureusement, l'événement de changement et quelques autres ne sont pas encore pris en charge avec live. Bind est la meilleure chose

+0

réponse génial !!! aidé tout de suite! –

3

Pour les articles qui sont dynamiquement insérés dans les DOM, les événements doivent être liés avec

$('.selector').bind('change',function() { doWork() }); 

En effet, lorsque vous exécutez $(function(){}); et lier des événements en utilisant $.click ou $.change, etc., vous liez à des événements éléments déjà existant dans le DOM. Toute manipulation que vous faites après cela ne sera pas affectée par tout ce qui se passe dans l'appel $(function(){});. $.bind indique à votre page de rechercher les éléments futurs dans votre sélecteur ainsi que les éléments actuels.

+0

Les deux .change et .bind fonctionnent de la même manière. Ils ne lieront que les éléments qui sont actuellement dans le DOM. – Anurag

+0

@anurag - incorrect. si les deux éléments sont déjà dans le DOM, oui, ils fonctionnent de la même manière. mais .change ne liera pas les nouveaux éléments dans le DOM (ce qui est la raison pour laquelle le PO pose la question ...), .bind liera les évènements actuels et futurs aux éléments. – Jason

+0

@Jason: Ce n'est pas si difficile à tester .. regardez ce petit extrait html (http://slexy.org/raw/s2XA8QihVm) J'ai écrit pour tester si 'bind' fonctionne pour les futurs éléments dom et il ne le fait pas . De plus, ceci est pris de la source de jQuery, il transfère fondamentalement les appels de fonction pour 'change()', 'mouseover()', 'blur()' etc .. vers 'bind()'. Voici un petit extrait de la source de jQuery montrant que - http://slexy.org/view/s206rDeFeO ou vous pouvez voir la source entière sur code.jQuery.com lui-même - http://code.jquery.com/jquery-latest. js. Et 'live()' est la fonction qui lie à la fois les événements actuels et futurs. – Anurag

1

essayer .live: http://docs.jquery.com/Events/live

De docs: Associe un gestionnaire à un événement (comme un clic) pour tout le courant - élément adapté - et futur. Peut également lier des événements personnalisés.

+0

** "Actuellement non supporté: ... changer ..." ** – Sampson

+0

Stack Overflow ÉCHEC! –

5

Un exemple en utilisant .live()

$('#my_form_id select[name^="my_select_name"]').live('change', (function() { 
    console.log($("option:selected", this).val()); 
    }) 
); 
+1

Cette .live() fonctionne toujours pour moi, au champ de sélection dynamiquement peuplé. –

+3

.live() est maintenant obsolète. Utilisez quelque chose comme '$ (document) .on (" changez ", '# mon_form_id sélectionnez [nom^=" mon_select_name "]', function() {...})' – Seybsen

1

J'ai trouvé comme solution pour rendre seulement

<select id="myselect"></select> 

dans le fichier php/html puis générer des options pour par ajax:

$.post("options_generator.php", function (data) { $("#myselect").append(data); }); 

Dans les options d'écho options_generator.php seulement:

echo "<option value='1'>1</option>"; 
echo "<option value='2'>2</option>"; 
6

Une plus à jour .. réponse

Étant donné que les éléments sont renseignés de manière dynamique, vous recherchez event delegation. Ne pas utiliser .live()/.bind()/.delegate(), cependant. Vous devez utiliser .on().

Selon le jQuery API docs:

À partir de jQuery 1.7, la méthode .on() est la méthode préférée pour la fixation des gestionnaires d'événements à un document. Pour les versions antérieures, la méthode .bind() est utilisée pour attacher un gestionnaire d'événements directement aux éléments. Les gestionnaires sont attachés aux éléments actuellement sélectionnés dans l'objet jQuery, de sorte que ces éléments doivent exister au point où se produit l'appel à .bind(). Pour une liaison d'événements plus flexible, voir la discussion sur la délégation d'événements au .on().

vous serait donc utiliser quelque chose comme ceci: "<.. $ Valeur Valeur option =" "'>"

$(document).on('change', 'select', function (e) { 
    /* ... */ 
}); 
+1

oui c'est pour tous les scénarios, statiques ou contenu dynamique :) – user889030