2009-07-31 8 views
16

Ich frage mich, wie programmatisch mit YUI3 ein Änderungsereignis ausgelöst - ich eine Änderung Zuhörer zu einer Auswahlbox Knoten hinzugefügt:YUI 3 programmatisch Feueränderungsereignis

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

und woanders wollen im Skript feuern dieses Ereignis. Es funktioniert natürlich, wenn ein Benutzer den Wert der Auswahlbox im Browser ändert. Aber ich habe viele Möglichkeiten ausprobiert, um es programmatisch auszulösen, von denen keines funktioniert hat. Einschließlich:

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

Jede Hilfe wäre willkommen!

Antwort

12

3,0 YUI unterstützt nicht die change Ereignisse simuliert, wie Sie entdeckt haben. Es wird jedoch in YUI 3.1 unterstützt. Es ist in the trunk jetzt.

Ihr dritter Versuch:

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

sollte in 3.1 arbeiten.

bearbeiten

Es ist wie Sie gerade die YUI 3.0-Version von event-simulate.js mit der Stamm-Version ersetzen können aussieht, und es wird in ein ansonsten 3.0 App arbeiten. Ich habe bisher keine Probleme gesehen.

+1

Nur ein Hinweis: Sie müssen Y.use ('node-event-simulate', ...) für .simulate() verfügbar sein. – thenickdude

6

Die übliche Lösung besteht nicht darin, das Ereignis programmgesteuert abzusetzen, sondern stattdessen die gesamte Ereignislogik in eine Funktion zu verschieben und stattdessen diese Funktion gegebenenfalls von Ihrem Code aus aufzurufen.

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

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

Ja, so mache ich es normalerweise, aber ich wollte wirklich wissen, ob es möglich ist. Ich denke es ist nicht. – ash

+1

'Y.get ('# mynode'). On ('ändern', AlertUserOfChange);' ist alles was Sie brauchen. Dann füge die Parameter zu AlertUserOfChange hinzu, so wie 'function AlertUserOfChange (e)' – imns

-1

Wie über dieses

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

Sorry, das funktioniert nicht. – ash