jQuery's .on() method combined with the submit event
Asked Answered
D

3

138

I've got a problem with .on(). I have multiple form-elements (forms with class="remember"), also I add another one form.remember using AJAX. So, I want it to handle submit event something like:

$('form.remember').on('submit',function(){...}) 

but form added with AJAX doesn't work with it.

Where is the problem? Is it a bug?

Doyenne answered 31/8, 2013 at 8:1 Comment(2)
Try $(document).on('submit','form.remember',function(){...})Deafmute
@Deafmute replace document with the closest static parent.Unsupportable
W
276

You need to delegate event to the document level

$(document).on('submit','form.remember',function(){
   // code
});

$('form.remember').on('submit' work same as $('form.remember').submit( but when you use $(document).on('submit','form.remember' then it will also work for the DOM added later.

Woodley answered 31/8, 2013 at 8:6 Comment(3)
Also bear in mind that $(document).on has much lower performance than $('form.remember').on('submit'. It now has to listen for all submit events in the document. It's much better to restrict the scope a little than listen on document, if possibleDannettedanni
$('body').on('submit','form.remember',function(){ // code }); solved my problemZebada
Even though @Dannettedanni is correct, $(document).on is still useful for CRUD operations on ajax rendered elements.Checkers
P
58

I had a problem with the same symtoms. In my case, it turned out that my submit function was missing the "return" statement.

For example:

 $("#id_form").on("submit", function(){
   //Code: Action (like ajax...)
   return false;
 })
Parson answered 29/3, 2016 at 17:17 Comment(2)
Note that return false; will not submit the form. For submitting the form use return true;.Distrain
If he uses ajax - submission will be done by ajax, later on 200 http status just will do intended activities. So return false will be useful.Enterectomy
H
2

The problem here is that the "on" is applied to all elements that exists AT THE TIME. When you create an element dynamically, you need to run the on again:

$('form').on('submit',doFormStuff);

createNewForm();

// re-attach to all forms
$('form').off('submit').on('submit',doFormStuff);

Since forms usually have names or IDs, you can just attach to the new form as well. If I'm creating a lot of dynamic stuff, I'll include a setup or bind function:

function bindItems(){
    $('form').off('submit').on('submit',doFormStuff); 
    $('button').off('click').on('click',doButtonStuff);
}   

So then whenever you create something (buttons usually in my case), I just call bindItems to update everything on the page.

createNewButton();
bindItems();

I don't like using 'body' or document elements because with tabs and modals they tend to hang around and do things you don't expect. I always try to be as specific as possible unless its a simple 1 page project.

Haskel answered 26/12, 2019 at 21:17 Comment(2)
Not really. Rather use $(document).on('submit','form',function(e) {...}); Then no need to 'reattach'Shelashelagh
I specifically said I don't like to do it on a global, document level. For a small, single page project this may be fine; but if you have a lot of different modules with their own forms global handlers create a lot of extra clicks and debugging problems if your code isn't targeted to specific forms.Haskel

© 2022 - 2024 — McMap. All rights reserved.