On Saturday 14 February 2009, Christian Beier wrote:
> Ich glaube die größte Schwierigkeit wird es sein, die vier Felder auf
> Eingaben "zu überwachen" um zum richtigen Zeitpunkt die Validierung
> anzustoßen und auch die Eingaben an den Rails-Controller zu
> übertragen.
Bei jQuery bin ich da nicht auf der Höhe, bin aber sicher, dass es die
nötigen Mittel gibt. Grundsätzlich musst du Client-seitig drei
Teilprobleme lösen: (1) Erkennen, dass sich die relevanten Felder
geändert haben. (2) Ajax-Request mit den serialisierten Feldern. (3)
Anzeige des Validierungsergebnisses.
Dabei solltest du noch sicherstellen, dass nicht jeder Tastendruck einen
Request an den Server auslöst. Das kannst du mit einem Timer erreichen,
der bei jeder Änderung neu gestartet wird und daher erst dann auslöst,
wenn es zwar eine Änderung gab, sich aber eine bestimmte Zeit nichts
mehr geändert hat. Mit Prototype habe ich das in einem eigenen
Validator mal mit der angehängten Klasse gemacht.
Michael
Event.UserActionObserver = Class.create();
Event.UserActionObserver.ignoredKeys = [
Event.KEY_TAB,
Event.KEY_RETURN,
Event.KEY_ESC
];
Event.UserActionObserver.prototype = {
initialize: function(container, callback, options) {
this.options = Object.extend({
latency: 0.4,
events: ['keypress', 'change']
}, options);
this.container = $(container);
this.callback = callback;
this.latency = this.options.latency * 1000;
this.timer = null;
this.notifyCallback = this._notifyCallback.bind(this);
this.onAction = this._onAction.bindAsEventListener(this);
this.start();
},
start: function() {
var events = this.options.events;
for (var i = 0; i < events.length; i++) {
Event.observe(this.container, events[i], this.onAction);
}
},
stop: function() {
var events = this.options.events;
for (var i = 0; i < events.length; i++) {
Event.stopObserving(this.container, events[i], this.onAction);
}
},
_onAction: function(event) {
if (Event.UserActionObserver.ignoredKeys.include(event.keyCode)) {
return;
}
if (this.timer) {
clearTimeout(this.timer);
}
this.timer = setTimeout(this.notifyCallback, this.latency);
},
_notifyCallback: function() {
this.callback();
}
};
--
Michael Schuerig
mailto:[email protected]
http://www.schuerig.de/michael/
_______________________________________________
rubyonrails-ug mailing list
[email protected]
http://mailman.headflash.com/listinfo/rubyonrails-ug