144

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?

2
  • 13
    Try $(document).on('submit','form.remember',function(){...}) Commented Aug 31, 2013 at 8:02
  • 3
    @Sergio replace document with the closest static parent. Commented Sep 21, 2018 at 13:07

3 Answers 3

280

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.

Sign up to request clarification or add additional context in comments.

3 Comments

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 possible
$('body').on('submit','form.remember',function(){ // code }); solved my problem
Even though @Liam is correct, $(document).on is still useful for CRUD operations on ajax rendered elements.
63

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;
 })

2 Comments

Note that return false; will not submit the form. For submitting the form use return true;.
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.
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.

2 Comments

Not really. Rather use $(document).on('submit','form',function(e) {...}); Then no need to 'reattach'
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.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.