Live form validace a nefungující onChange u comboboxu
- PetrHH
- Člen | 49
Dobrý večer,
používám script live-form-validation.js pro live validaci. Vše chodí nádherně až na to, že mi u comba nezavolá onChange. Nevíte, prosím, co dělám blblě?
<select name="pokus" onchange="cmbOnChange();">
<option value="1">prvni</option>
<option value="2">druhe</option>
</select>
Pokud do stránky live-form-validation.js nevložím, onChange se normálně vyvolá. Ideální stav by pro mě byl funkční live validace a i událost onChange.
Petr
- redhead
- Člen | 1313
Je to proto, že plugin není závislý na žádné knihovně typu jQuery a
vlastní handlery pro live validaci nasazuje právě na on*
události. Řešením je události v pluginu přepsat pomocí jQuery nebo NetteQ
(https://github.com/…eQ/netteQ.js#L2).
Přepsat handlery v pluginu je jednoduché, stačí upravit přímo na to dělanou metodu.
- redhead
- Člen | 1313
Zhruba takto, ale neotestoval jsem to. Celá ta metoda byla přepsána do jQuery (tj. včetně metod pro práci s classama)
LiveForm.setUpHandlers = function(el) {
var $el = $(this);
if ($el.hasClass(this.options.noLiveValidation)) return;
var handler = function(event) {
Nette.validateControl(event.target);
};
$el.on('change', handler);
$el.on('blur', handler);
var self = this;
$el.on('keydown', function (event) {
if (self.options.wait >= 200) {
// Hide validation span tag.
$el.removeClass(self.options.controlErrorClass);
$el.removeClass(self.options.validMessageClass);
var error = self.getMessageElement(this);
error.html('');
error.removeClass();
// Cancel timeout to run validation handler
if (self.timeout) {
clearTimeout(self.timeout);
}
}
});
$(el).on('keyup', function(event) {
if (event.keyCode !== 9) {
if (self.timeout) clearTimeout(self.timeout);
self.timeout = setTimeout(function() {
handler(event);
}, self.options.wait);
}
});
}
Stačí nahradit původní metodu LiveForm.setUpHandlers
kódem
výše. Ale opakuji, neotestoval jsem to (ani na správnost syntaxe :D)
Editoval redhead (28. 10. 2013 12:07)