How do I select the parent form based on which submit button is clicked?
Asked Answered
E

5

137

I have a web page with 3 forms on it. Not nested, just one after the other (they are almost identical, just one hidden variable that's different). A user will only fill in one form, and I'd like to validate/etc all the forms with only one JS script.

So how, when a user clicks the submit button of form#1, do I make my js script only deal with the fields in form1? I gather it has something to do with $(this).parents , but I am not sure what to do with it.

My validation script (which I used elsewhere, with only a single form) looks something like so:


$(document).ready(function(){
    $("#submit").click(function(){
        $(".error").hide();
        var hasError = false;

        var nameVal = $("#name").val();
        if(nameVal == '') {
            $("#name").after('Please enter your name.');
            hasError = true;
        }


        if(hasError == false) {blah blah do all the processing stuff}

So do I need to replace things like $("#name").val() with $(this).parents('form').name.val() ? Or is there a better way to go about this?

Thanks!

Euchromatin answered 22/11, 2008 at 17:57 Comment(0)
L
205

You can select the form like this:

$("#submit").click(function(){
    var form = $(this).parents('form:first');
    ...
});

However, it is generally better to attach the event to the submit event of the form itself, as it will trigger even when submitting by pressing the enter key from one of the fields:

$('form#myform1').submit(function(e){
     e.preventDefault(); //Prevent the normal submission action
     var form = this;
     // ... Handle form submission
});

To select fields inside the form, use the form context. For example:

$("input[name='somename']",form).val();
Lumbard answered 22/11, 2008 at 18:9 Comment(4)
You could also use to select all the input children: $(this).children().filter("input")Bedad
or $("input,textarea,select",form)Lumbard
Why can't you use var form = $(this).form like in normal Javascript: function onClick(button) { var form = button.form; } ???Courtesan
closest('form') is better as it stops after finding the first matching parent element. parents('form:first') traverses the entire DOM and then applies the filter api.jquery.com/closest/#entry-longdescAlula
W
73

I found this answer when searching for how to find the form of an input element. I wanted to add a note because there is now a better way than using:

var form = $(this).parents('form:first');

I'm not sure when it was added to jQuery but the closest() method does exactly what's needed more cleanly than using parents(). With closest the code can be changed to this:

var form = $(this).closest('form');

It traverses up and finds the first element which matches what you are looking for and stops there, so there's no need to specify :first.

Whitney answered 12/4, 2011 at 14:8 Comment(0)
U
54

To get the form that the submit is inside why not just

this.form

Easiest & quickest path to the result.

Unplaced answered 22/11, 2008 at 22:22 Comment(2)
why the need for the jquery wrapper!Unplaced
Because this was asked as a jQuery question too. And as the accepted answer also returns a jQuery object I though that it would be nice. All "why do that with jQuery when you can do it without it the same way" aside.Aer
G
4

i used the following method & it worked fine for me

$('#mybutton').click(function(){
        clearForm($('#mybutton').closest("form"));
    });

$('#mybutton').closest("form") did the trick for me.

Gyasi answered 17/5, 2012 at 11:19 Comment(0)
C
3

Eileen: No, it is not var nameVal = form.inputname.val();. It should be either...

in jQuery:

// you can use IDs (easier)

var nameVal =  $(form).find('#id').val();

// or use the [name=Fieldname] to search for the field

var nameVal =  $(form).find('[name=Fieldname]').val();

Or in JavaScript:

var nameVal = this.form.FieldName.value;

Or a combination:

var nameVal = $(this.form.FieldName).val();

With jQuery, you could even loop through all of the inputs in the form:

$(form).find('input, select, textarea').each(function(){

  var name = this.name;
  // OR
  var name = $(this).attr('name');

  var value = this.value;
  // OR
  var value = $(this).val();
  ....
  });
Continual answered 8/6, 2009 at 2:18 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.