Autor Zpráva
user243
Profil
Ahoj,
mám dva formuláře, kterými přidávám a odebírám nějaká data do tabulky v databázi. Problém je, že se mi občas u mazání a snad vždy u přidávání stana, že se formulář odešle klasicky a javascript to nějak neodchytí. scripty pro zpracování formulářů jsou skoro totožné až na identifikároty.
Celé to má fungovat tak, že tlačítko otevře příslušné modální okno, do něj se načte vygenerovaná šablona s daty z tabulky a příslušnými formuláři. Při odeslání formuláře se událost odchytí, zpracuje se ajaxem a nakonec se tělo modálního okna překreslí daty ze serveru.
        /** modal */
        $('#modal_allowed_users').on('show.bs.modal', function (event) {
          var button = $(event.relatedTarget) // Button that triggered the modal
          var modal = $(this)

          modal.find('.modal-title').html(button.data('title'))
          $(modal.find('.modal-body')).load('index.php?' + button.data('parametrs'), function() {
              $('#form_add_allowed_users').submit(function(event) {
                  event.preventDefault(); 

                  var $form = $(this)
                  $.ajax({
                      type: $form.attr('method'),
                      url: $form.attr('action'),
                      data: $form.serialize(),
                  
                      success: function(data, status) {
                              $(modal.find('.modal-body')).html(data);
                      }
                  });
              })
          })

        })

edit:
Zdá se, že byl problém právě v tom, že jsem přegeneroval právě celý obsah včetně formulářů, kterým jsem před tím nastavil událost, takže při tom překreslení nebylo nastavené pro nový obsah žádné odchytávání. Opravil jsem to tak, že po vykreslení nového html kódu si zavolám tu samou anonymní funkci, která mi zase nedefinuje odchytávání.
        /** modal */
        $('#modal_allowed_users').on('show.bs.modal', function (event) {
          var button = $(event.relatedTarget) // Button that triggered the modal
          var modal = $(this)

          modal.find('.modal-title').html(button.data('title'))
          $(modal.find('.modal-body')).load('index.php?' + button.data('parametrs'), callback = function() {
              $('#form_add_allowed_users').submit(function(event) {
                  event.preventDefault(); 

                  var $form = $(this)
                  $.ajax({
                      type: $form.attr('method'),
                      url: $form.attr('action'),
                      data: $form.serialize(),
                  
                      success: function(data, status) {
                              $(modal.find('.modal-body')).html(data);
                              callback();
                      }
                  });
              })
          })

        })
Str4wberry
Profil
Čili je problém vyřešen?
Keeehi
Profil
Problém jsi identifikoval správně. V dřívějším jQuery byla funkce .love() která registrovala události i později přidaným elementům. Byla však odstraněna a podle dokumentace by ji měla nahradit funkce .on()
$('#form_add_allowed_users').on('submit', function ...
Snad by to takto mělo fungovat.
Chamurappi
Profil
Reaguji na usera243:
callback = function()
Tímhle vyrábíš globální proměnnou callback, pokud nikde lokálně nemáš var callback.
Já bych místo toho napsal function callback(). A neříkal bych pak funkčním výrazům anonymní funkce, když bych je měl pojmenované. Funkční výraz může mít jméno a to jméno pak funguje jako lokální proměnná uvnitř takto zapsané funkce.


Reaguji na Keeehiho:
V dřívějším jQuery byla funkce .love() která registrovala události i později přidaným elementům.
… a činila tak s láskou :-)
Chtěl jsi napsat .live(), ale je to pěkný překlep. Ještě když uvážím, že by objekt.love("událost") nahradili za objekt.on("událost")
user243
Profil
Str4wberry:
Nyní ano.

Keeehi:
S funkcí .on() se to nechovalo dobře - možná i stejně.

Chamurappi:
Prvně jsem tam měl var callback přímo v parametru .load(), ale skončilo to chybou kvůli var. Takže jsem jej oddělal a jelo to, že jsem z toho měl globální proměnou a dost blbě pojmenovanou jsem věděl, nicméně jsem byl v momentální euforii, že to konečně jede. V tu chvíli mě nějak nenapadlo vytvořit lokální proměnou nad tím.
Na slovní spojení funkční výraz jsem si nevzpomněl, tak jsem to alespoň zkusil nějak popsat. Více se mi líbí to mít udělané přes funkční výraz než přes funkci.

/** modal */
        $('#modal_allowed_users').on('show.bs.modal', function (event) {
          var button = $(event.relatedTarget) // Button that triggered the modal
          var modal = $(this)
          var callback_set_submit

          modal.find('.modal-title').html(button.data('title'))
          $(modal.find('.modal-body')).load('index.php?' + button.data('parametrs'), callback_set_submit = function() {
              $('#form_delete_allowed_users').submit(function(event) {

                  if (confirm('Opravdu smazat?')) {
                      var $form = $(this)
                      $.ajax({
                          type: $form.attr('method'),
                          url: $form.attr('action'),
                          data: $form.serialize(),
                      
                          success: function(data, status) {
                                  $(modal.find('.modal-body')).html(data);
                                  callback_set_submit();
                          }
                      });
                      }
                  event.preventDefault();
                  })

                    $('#form_add_allowed_users').submit(function(event) {

                            var $form = $(this)
                            $.ajax({
                                type: $form.attr('method'),
                                url: $form.attr('action'),
                                data: $form.serialize(),
                            
                                success: function(data, status) {
                                        $(modal.find('.modal-body')).html(data);
                                        callback_set_submit();
                                }
                            });
                        event.preventDefault();
                        })
          })
        })
Chamurappi
Profil
Reaguji na usera243:
Více se mi líbí to mít udělané přes funkční výraz než přes funkci.
Funkční výraz ale pořád může mít i jméno. Můžeš opravdu nahradit callback_set_submit = function() za function callback_set_submit(), přímo tam, kde to máš – pak je identifikátor callback_set_submit rovnou dostupný jako lokální proměnná uvnitř tohoto výrazu. (A proto je pojem „anonymní funkce“ lehce zavádějící… když tatáž věc, chovající se vesměs stejně, nemusí být anonymní.)

Zjednodušeně:
var x = function a()
{
  alert(typeof a);  // function
};
alert(typeof x);  // function
alert(typeof a);  // undefined

Pojmenované funkční výrazy se moc často nepoužívají (na rozdíl od nepojmenovaných funkčních výrazů a normálních pojmenovaných funkcí), mívají uplatnění skoro jen v rekurzi. Zrovna tvůj případ je taková zvláštní rekurze.
_es
Profil
Chamurappi:
Môže sa však zaobísť aj bez toho:
var x = function ()
{
  alert(typeof x);  // function
};
Mimochodom, tvoj kód v IE8 zobrazí v poslednom príkaze function. Ako to je v novších IE, či iných prehliadačoch?

Vaše odpověď

Mohlo by se hodit

Neumíte-li správně určit příčinu chyby, vkládejte odkazy na živé ukázky.
Užíváte-li nějakou cizí knihovnu, ukažte odpovídajícím, kde jste ji vzali.

Užitečné odkazy:

Odkud se sem odkazuje


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: