YUI 3 déclenche un événement de changement par programme
Question
Je me demandais comment déclencher par programmation un événement de modification avec YUI3. J'ai ajouté un écouteur de modification à un nœud de la boîte de sélection:
Y.get('#mynode').on('change', function(e) {
Alert(“changed me”);
});
et quelque part dans le script veulent déclencher cet événement. Cela fonctionne, bien sûr, lorsqu'un utilisateur modifie la valeur de la zone de sélection dans le navigateur. Mais j'ai essayé de nombreuses manières de le déclencher par programme, mais aucun n'a fonctionné. Y compris:
// All below give this error: T[X] is not a function (referring to what's called in .invoke(), // in the minified javascript
Y.get('#mynode').invoke('onchange');
Y.get('#mynode').invoke('change');
Y.get('#mynode').invoke('on','change');
Y.get('#mynode').invoke("on('change')");
/* Tried using .fire() which I found here:
* http://developer.yahoo.com/yui/3/api/EventTarget.html#method_fire
* Nothing happens
*/
Y.get('#mynode').fire('change');
/* Looking around the APIs some more, I found node-event-simulate.js:
* http://developer.yahoo.com/yui/3/api/node-event-simulate.js.html,
* which by its name would seem to have what I want. I tried:
* Error: simulate(): Event 'change' can't be simulated.
* ( (function(){var I={},B=new Date().getTim...if(B.isObject(G)){if(B.isArray(G)){E=1;\n)
*/
Y.get('#mynode').simulate('change');
Toute aide serait appréciée!
La solution
YUI 3.0 ne prend pas en charge la simulation des événements change
, comme vous l'avez découvert. Cependant, il sera supporté dans YUI 3.1. C’est dans le coffre maintenant.
Votre troisième tentative:
Y.get('#mynode').simulate('change');
devrait fonctionner en 3.1.
modifier
Il semble que vous puissiez simplement remplacer la version YUI 3.0 de event-simulate.js
par la version trunk, et cela fonctionnera dans une application 3.0 autrement. Je n'ai vu aucun problème jusqu'à présent.
Autres conseils
La solution habituelle consiste à ne pas déclencher l'événement par programme, mais à déplacer toute la logique de l'événement vers une fonction et à appeler cette fonction à partir de votre code, le cas échéant.
Y.get('#mynode').on('change', function(e) {
AlertUserOfChange();
});
function AlertUserOfChange()
{
Alert(“changed me”);
}
Que diriez-vous de cela
Y.Event.simulate('#mynode', 'change');