Live form validace a nefungující onChange u comboboxu

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
PetrHH
Člen | 49
+
0
-

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
+
0
-

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.

Vajalit
Člen | 11
+
0
-

Ahoj,
je to sice už dlouho co se toto vlákno založilo, ale mohl bys prosím udělat nástřel jak to například v tomto případě udělat?
Díky,
Jirka

redhead
Člen | 1313
+
0
-

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)

Vajalit
Člen | 11
+
0
-

Díky, zkusím ;)

Vajalit
Člen | 11
+
0
-

Je to naprosto funkční.
Díky