2009-07-31 13 views
16

Mi chiedevo come al fuoco di programmazione di un evento di modifica con YUI3 - ho aggiunto un cambiamento ascoltatore ad uno di selezione del nodo di dialogo:YUI 3 di programmazione cambiamento evento fuoco

Y.get('#mynode').on('change', function(e) { 
Alert(“changed me”); 
}); 

e da qualche altra parte nel copione vuole sparare quell'evento. Funziona, ovviamente, quando un utente cambia il valore della casella di selezione nel browser. Ma ho provato molti modi per farlo funzionare a livello di codice, nessuno dei quali ha funzionato. Incluso:

// 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'); 

Qualsiasi aiuto sarebbe apprezzato!

risposta

12

YUI 3.0 non supporta simulando le change eventi, come hai scoperto. Tuttavia sarà supportato in YUI 3.1. È in the trunk adesso.

Il tuo terzo tentativo:

Y.get('#mynode').simulate('change'); 

dovrebbe funzionare in 3.1.

modificare

Sembra che si può semplicemente sostituire la versione 3.0 su YUI event-simulate.js con la versione tronco, e funzionerà in un 3.0 app altrimenti. Non ho visto nessun problema finora.

+1

Solo una nota: devi Y.use ('node-event-simulate', ...) per .simulate() per essere disponibile. – thenickdude

6

La soluzione usuale non è quella di generare automaticamente l'evento, ma piuttosto spostare tutta la logica dell'evento in una funzione, e invece chiamare tale funzione dal proprio codice, laddove appropriato.

Y.get('#mynode').on('change', function(e) { 
    AlertUserOfChange(); 
}); 

function AlertUserOfChange() 
{ 
    Alert(“changed me”); 
} 
+0

Sì, è così che normalmente lo faccio, ma volevo davvero sapere se fosse possibile. Immagino che non lo sia. – ash

+1

'Y.get ('# mynode'). On ('cambia', AlertUserOfChange);' è tutto ciò che serve. Quindi aggiungi il parametro a AlertUserOfChange, ad esempio 'function AlertUserOfChange (e)' – imns

-1

ne dite di questo

Y.Event.simulate('#mynode', 'change'); 
+0

Spiacente, questo non funziona. – ash