Nefunkční validace ajaxového formuláře

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

Dobrý den, mám problém s odesíláním ajaxového formuláře a nemohu přijít na to kde. Na stránce při načítání generuji přímo jeden formulář (frm-createQuestion) a poté pod něj ajaxem načítám ještě jeden formulář (frm-form12).

První formulář odesílám na keyup a u něko, když nevyhovuje pravidlo nette, tedy že musí být vyplněn text, tak mi to hodí správně alert, že musím text vyplnit. Bohužel u druhého to vůbec validaci nespustí, if($(this).ajaxSubmit()) { projde, ale formulář se ani k php obsluze nedostane. Ten ajax mi vrátí html code celé stránky na které aktuálně jsem.

JS na ajaxové odesílání:

var updateTimer;
$('#textInput').live("keyup", function(){
    clearTimeout(updateTimer);
    updateTimer = setTimeout('$("#frm-createQuestion").saveQuestion()', 500);
})

(function( $ ){

    $.fn.saveQuestion = function() {
        if($(this).ajaxSubmit()) {
            var qid = $('#type_a option:selected').val();
            $.ajax({
                url: "?do=answerType&type="+qid,
                dataType: 'json',
                success: function(){
                    $('html').removeClass('busy');
                }
            });
        }
        return false;
    };

})( jQuery );

$("form.qAjax").live("submit", function () {
    if($(this).ajaxSubmit()) {
        $(".popupField").fadeOut(function(){
            $('#answerWrapper').html('');
            $('#type_a').val('');
            $('.format').hide();
            $('.format2').hide();
            $('#textInput').val('');
        });

        if(!$(this).closest("form").hasClass('notReset'))
            $(this).closest("form").clearForm();

        $('html').removeClass('busy');
    }
    return false;
});


$("form.qAjax :submit").live("click", function () {
    if($(this).ajaxSubmit()) {
        $(".popupField").fadeOut(function(){
            $('#answerWrapper').html('');
            $('#type_a').val('');
            $('.format').hide();
            $('.format2').hide();
            $('#textInput').val('');
        });

        if(!$(this).closest("form").hasClass('notReset'))
            $(this).closest("form").clearForm();

    }
    return false;
});

Vygenerované HTML:

http://pastebin.com/XrW3LAYK

Zkoušel jsem si různě debugovat podle alertu, vždy projdu přes řádek:

// validation
if (form.get(0).onsubmit && !form.get(0).onsubmit()) return null;

v pohodě, ale když mám alert u validací nette (nettForms.js ⇒ Nette.validateControl), tak mi nic nevyskočí, prostě validace se nespustí a nevím proč.

Děkuji za pomoc

Jack06
Člen | 168
+
0
-

Zjistil jsem že u tohoto formuláře když si přes consoli zkusím vypsat jednotlivé kroky, tak mi toto:
form.get(0).onsubmit()

zahlásí:

form.get(0).onsubmit is not a function
[Zastavit při této chybě]

console.log(form.get(0).onsubmit());

Nejspíše se neaplikuje Nette.addEvent. Lze to nějak vyřešit? Zvláštní je že mi to ještě nedávno fungovalo ale nyní to už nefunguje..

Editoval Jack06 (26. 5. 2012 11:54)

uestla
Backer | 799
+
0
-

Problém je v tom, že Nette validace se navěšuje při načtení stránky, čili jakékoliv další připínání formulářů až po načtení automaticky validaci nenastavuje.

Osobně jsem to vyřešil následovně:

  1. zakomentoval jsem si v netteForms.js navěšení

netteForms.js

// ...

/* Nette.addEvent(window, 'load', function () {
	for (var i = 0; i < document.forms.length; i++) {
		Nette.initForm(document.forms[i]);
	}
}); */
  1. a navěšuji ho ručně pomocí livequery

jquery.nette.js

// ...

$(function () {

	$('form').livequery(function () {
		var $this = $(this);
		Nette.initForm($this[0]);

	});
});

// ...
Jack06
Člen | 168
+
0
-

Problem solved. Na formulář jsem při načtení nechal aplikovat Nette.initForm() a už to šlape.