7
votes

Callback après la fonction jQuery.trigger ()

J'ai un petit problème ici. Je dois déclencher un événement contenant $ .post () pour charger un formulaire et l'attribuer à un DOM. Une fois cela est fait, j'ai modifier les champs du formulaire.

J'ai essayé: xxx

Malheureusement, cela ne fonctionne pas et si je le laisse, comme ça: xxx

le Le changement ressemble même à ceci: xxx

puis l'édition de formulaire est exécutée avant que le formulaire soit correctement chargé et attaché à dom. Cela pourrait être une question stupide pour les gars JavaScript, mais je suis principalement un gars PHP alors ne soyez donc pas cruel: -)

Merci


4 commentaires

Avez-vous vraiment besoin de déclencher l'événement modifier ? Pouvez-vous non seulement refroidir le code dans votre changer dans une fonction distincte que vous pouvez simplement appeler?


Où est-ce que get_id_from_id vient?


@Royfinley je m'attendais à cette question. C'est une fonction aussi socialistive que personne ne tentera jamais de l'utiliser avec ce nom.


Pas une solution, mais une explication de ce que vous voyez maintenant: la fonction de rappel que vous avez transmise à .done est exécutée dès que la fonction que vous avez transmise à. Quand est exécuté. Quand est exécuté. Cela signifie que le rappel de .done est exécuté après le déclenchement de l'événement "Changement", mais avant que ce soit appelé des gestionnaires a été appelé et bien sûr avant que votre appel soit exécuté, le poste est exécuté, beaucoup moins avant que le poste soit terminé et retourné.


4 Réponses :


-3
votes

.Live a été obsolète en jQuery depuis v1.7 et a été supprimé en v1.9.

Vous devez le remplacer par .on () .

.on a 2 signatures pour des éléments de liaison, tandis que .Live n'a eu que 1.

Si l'élément existe au moment où vous êtes contraignant, vous le faites comme ceci: xxx

Vous pouvez même utiliser le raccourci: xxx

Si l'élément n'existe pas à l'époque ou que de nouveaux seront ajoutés (ce qui est ce que .Live était normalement utilisé pour), vous devez utiliser "Délégation d'événement" : xxx

Remarque: vous souhaitez lier à l'élément statique le plus proche, pas toujours document .

Entre-temps, jQuery migrer plugin peut être utilisé pour restaurer le .li ve () fonctionnalité Si vous mettez à niveau votre jQuery vers la version la plus récente.


2 commentaires

Merci pour votre commentaire Roy. Je vais réécrire la fonction .Live () à .on () mais je pense que cela ne m'aidera pas avec mon problème. Est-ce compréhensible ou devrais-je simplement décrire le problème plus profond?


@Felixkling a essayé de trouver un problème, mais l'utilisateur n'a jamais répondu à mon formulaire de questions ci-dessus. Où est-ce que get_id_from_id vient? Mais on dirait que Matt a tout compris.



8
votes

peut séparer votre code code> le code du gestionnaire? Quelque chose comme ceci: xxx pré>

puis au lieu de déclencher le code> changer code> Vous pouvez simplement appeler hanterlechange code> transmettre un rappel à exécuter lorsque l'appel Ajax est Terminer: P>

handleChange($("#type_rank_field"), function(data) {
    $('#quest_'+questions[i].split('|')[1])
        .children('option[value="'+questions[i].split('|')[0]+'"]')
        .attr('selected',true);
});


2 commentaires

Cela ressemble en fait à une bonne idée! Je vais l'essayer et je vous ferai savoir si le problème est résolu ou non :)


@ MatTburland: Je n'ai signalé que cela comme j'utilise parfois ce motif exact et je me suis tiré dans le pied avant: d. Si JS m'a appris quelque chose, il ne s'appelle pas sur la coercition de type



7
votes

Renvoie l'objet de promesse de votre gestionnaire d'événements: xxx pré>

puis utilisez triggerhandler () code> à la place. p>

var promise = $('#type_rank_field').triggerHandler('change');
promise && promise.done(function(){
    // do stuff
});


11 commentaires

Wow ... Est-ce documenté?


Oui, il est documenté, la dernière balle de première section. API.JQUERY.com/triggerHandler


Cool. Un peu fragile (dépend de l'ordre des gestionnaires d'événements), mais intéressant.


Ok Kevin B indique une réponse à l'aide de la fonction dépréciée exacte live () et d'obtenir les uppots. Je place une réponse qui vous dit de ne pas utiliser cette fonction car elle pourrait faire partie de votre problème et je suis descendu. Comment ça marche ..... -1


Cela pourrait être corrigé avec un espace de noms en 1.9+, bien que les versions précédentes manipulèrent les espaces de noms de manière incohérente.


L'utilisation de .Live n'a rien à voir avec cette question.


@Roy: Vous êtes correct, .Live ne doit plus être utilisé, mais tous les faits corrects ne répondent pas à toutes les questions. Votre réponse ne résout pas le problème. C'est bon comme un commentaire mais pas comme une réponse.


Il est donc correct de donner des réponses à l'aide du code obsolète et supprimé tant que cela fonctionne ........ Pas de bonne forme.


Comment savez-vous qu'il n'utilise pas JQuery 1.3.2? S'il a mentionné qu'il utilisait 1,7+ ou utilisait une méthode mise en œuvre dans 1,7+, je suis d'accord avec la modification de cette partie du code dans la réponse. Tout ce que nous savons, c'est qu'il est au moins en utilisant 1.5 en raison de l'utilisation différée.


JQuery dit: Les utilisateurs d'anciennes versions de JQuery doivent utiliser .Delegate () de préférence à .Live (). .... :)


Cela semble ok, mais ne fonctionne pas :-( J'utilise 1.8.2. Il ne charge même pas la forme.



2
votes

Je pense que nous devons ajouter du rappel après posté

$('#type_rank_field').trigger('change', [function(){
  $('#quest_'+questions[i].split('|')[1]).children('option[value="'+questions[i].split('|')[0]+'"]').attr('selected',true);
}]);


0 commentaires