How an I get all form elements (input, textarea & select) with jQuery?

Jquery

Jquery Problem Overview


Is there an easy way (without listing them all separately) in jquery to select all form elements and only form elements.

I can't use children() etc because the form contains other HTML.

E.g:

$("form").each(function(){
	let $inputs = $("input, textarea, select", this);
});

Jquery Solutions


Solution 1 - Jquery

Edit: As pointed out in comments (Mario Awad & Brock Hensley), use .find to get the children

$("form").each(function(){
    $(this).find(':input') //<-- Should return all input elements in that specific form.
});

forms also have an elements collection, sometimes this differs from children such as when the form tag is in a table and is not closed.

var summary = [];
$('form').each(function () {
    summary.push('Form ' + this.id + ' has ' + $(this).find(':input').length + ' child(ren).');
    summary.push('Form ' + this.id + ' has ' + this.elements.length + ' form element(s).');
});

$('#results').html(summary.join('<br />'));

<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<form id="A" style="display: none;">
    <input type="text" />
    <button>Submit</button>
</form>
<form id="B" style="display: none;">
    <select><option>A</option></select>
    <button>Submit</button>
</form>

Login Area

UserID:

Password:



May be :input selector is what you want

$("form").each(function(){ $(':input', this)//<-- Should return all input elements in that specific form. });

As pointed out in docs

>To achieve the best performance when using :input to select elements, first select the elements using a pure CSS selector, then use .filter(":input").

You can use like below,

$("form").each(function(){
    $(this).filter(':input') //<-- Should return all input elements in that specific form.
});

Solution 2 - Jquery

The below code helps to get the details of elements from the specific form with the form id,

$('#formId input, #formId select').each(
	function(index){  
		var input = $(this);
		alert('Type: ' + input.attr('type') + 'Name: ' + input.attr('name') + 'Value: ' + input.val());
	}
);

The below code helps to get the details of elements from all the forms which are place in the loading page,

$('form input, form select').each(
	function(index){  
		var input = $(this);
		alert('Type: ' + input.attr('type') + 'Name: ' + input.attr('name') + 'Value: ' + input.val());
	}
);

The below code helps to get the details of elements which are place in the loading page even when the element is not place inside the

tag,

$('input, select').each(
	function(index){  
		var input = $(this);
		alert('Type: ' + input.attr('type') + 'Name: ' + input.attr('name') + 'Value: ' + input.val());
	}
);

NOTE: We add the more element tag name what we need in the object list like as below,

Example: to get name of attribute "textarea",

$('input, select, textarea').each(
	function(index){  
		var input = $(this);
		alert('Type: ' + input.attr('type') + 'Name: ' + input.attr('name') + 'Value: ' + input.val());
	}
);

Solution 3 - Jquery

If you have additional types, edit the selector:

var formElements = new Array();
$("form :input").each(function(){
    formElements.push($(this));
});

All form elements are now in the array formElements.

Solution 4 - Jquery

JQuery serialize function makes it pretty easy to get all form elements.

Demo: http://jsfiddle.net/55xnJ/2/

$("form").serialize(); //get all form elements at once 

//result would be like this:
single=Single&multiple=Multiple&multiple=Multiple3&check=check2&radio=radio1

To compound on that idea: you can use something like this to make all form elements accessible.

Data = $('form').serialize().split('&');

for(i in Data){
    Data[i] = Data[i].split('=');
	Fields[ Data[i][0] ] = [ Data[i][1],
                             $('form *[name="' + Data[i][0] + '"]').eq(0) ];
}

console.log(Fields);

// The result would be a multi-dimensional array you could loop through
Fields[Field_Name] = [Field_Value, Field_Object]

Note: This will only work with named fields as serialize() will ignore all others. Any fields with duplicate names will be ignored. You could make a multi-dimensional array if multiple fields use the same name.

Solution 5 - Jquery

For the record: The following snippet can help you to get details about input, textarea, select, button, a tags through a temp title when hover them.

enter image description here

$( 'body' ).on( 'mouseover', 'input, textarea, select, button, a', function() {
    var $tag = $( this );
    var $form = $tag.closest( 'form' );
    var title = this.title;
    var id = this.id;
    var name = this.name;
    var value = this.value;
    var type = this.type;
    var cls = this.className;
    var tagName = this.tagName;
    var options = [];
    var hidden = [];
    var formDetails = '';

    if ( $form.length ) {
        $form.find( ':input[type="hidden"]' ).each( function( index, el ) {
            hidden.push( "\t" + el.name + ' = ' + el.value );
        } );

        var formName = $form.prop( 'name' );
        var formTitle = $form.prop( 'title' );
        var formId = $form.prop( 'id' );
        var formClass = $form.prop( 'class' );

        formDetails +=
            "\n\nFORM NAME: " + formName +
            "\nFORM TITLE: " + formTitle +
            "\nFORM ID: " + formId +
            "\nFORM CLASS: " + formClass +
            "\nFORM HIDDEN INPUT:\n" + hidden.join( "\n" );
    }

    var tempTitle =
        "TAG: " + tagName +
        "\nTITLE: " + title +
        "\nID: " + id +
        "\nCLASS: " + cls;

    if ( 'SELECT' === tagName ) {
        $tag.find( 'option' ).each( function( index, el ) {
            options.push( el.value );
        } );

        tempTitle +=
            "\nNAME: " + name +
            "\nVALUE: " + value +
            "\nTYPE: " + type +
            "\nSELECT OPTIONS:\n\t" + options;

    } else if ( 'A' === tagName ) {
        tempTitle +=
            "\nHTML: " + $tag.html();

    } else {
        tempTitle +=
            "\nNAME: " + name +
            "\nVALUE: " + value +
            "\nTYPE: " + type;
    }

    tempTitle += formDetails;

    $tag.prop( 'title', tempTitle );
    $tag.on( 'mouseout', function() {
        $tag.prop( 'title', title );
    } )
} );

Solution 6 - Jquery

This is my favorite function and it works like a charm for me!

It returns an object with all for input, select and textarea data.

And it's trying to getting objects name by look for elements name else Id else class.

var form_data = get_form_data();
console.log(form_data);

Function:

function get_form_data(element){
	element = element || '';
	var all_page_data = {};
	var all_forms_data_temp = {};
	if(!element){
		element = 'body';
	}

	if($(element)[0] == undefined){
		return null;
	}

	$(element).find('input,select,textarea').each(function(i){
		all_forms_data_temp[i] = $(this);
	});

	$.each(all_forms_data_temp,function(){
		var input = $(this);
		var element_name;
		var element_value;

		if((input.attr('type') == 'submit') || (input.attr('type') == 'button')){
			return true;
		}

		if((input.attr('name') !== undefined) && (input.attr('name') != '')){
			element_name = input.attr('name').trim();
		} else if((input.attr('id') !== undefined) && (input.attr('id') != '')){
			element_name = input.attr('id').trim();
		} else if((input.attr('class') !== undefined) && (input.attr('class') != '')){
			element_name = input.attr('class').trim();
		}

		if(input.val() !== undefined){
			if(input.attr('type') == 'checkbox'){
				element_value = input.parent().find('input[name="'+element_name+'"]:checked').val();
			} else if((input.attr('type') == 'radio')){
				element_value = $('input[name="'+element_name+'"]:checked',element).val();
			} else {
				element_value = input.val();
			}
		} else if(input.text() != undefined){
			element_value = input.text();
		}

		if(element_value === undefined){
			element_value = '';
		}

		if(element_name !== undefined){
			var element_array = new Array();
			if(element_name.indexOf(' ') !== -1){
				element_array = element_name.split(/(\s+)/);
			} else {
				element_array.push(element_name);
			}

			$.each(element_array,function(index, name){
				name = name.trim();
				if(name != ''){
					all_page_data[name] = element_value;
				}
			});
		}
	});
	return all_page_data;
}

Solution 7 - Jquery

jQuery keeps a reference to the vanilla JS form element, and this contains a reference to all of the form's child elements. You could simply grab the reference and proceed forward:

var someForm = $('#SomeForm');

$.each(someForm[0].elements, function(index, elem){
    //Do something here.
});

Solution 8 - Jquery

var $form_elements = $("#form_id").find(":input");

All the elements including the submit-button are now in the variable $form_elements.

Solution 9 - Jquery

Just to add another way:

$('form[name=' + formName + ']').find(':input')

Solution 10 - Jquery

Try this function

function fieldsValidations(element) {
    var isFilled = true;
    var fields = $("#"+element)
        .find("select, textarea, input").serializeArray();

    $.each(fields, function(i, field) {
        if (!field.value){
            isFilled = false;
            return false;
        }
    });
    return isFilled;
}

And use it as

$("#submit").click(function () {

    if(fieldsValidations('initiate')){
        $("#submit").html("<i class=\"fas fa-circle-notch fa-spin\"></i>");
    }
});

Enjoy :)

Solution 11 - Jquery

I used this way to get all input fields from a certain form:

$("#myForm").find("input").each(function() {
   // your stuff goes here
});

Or for the case here:

$("#myForm").find("select, textarea, input").each(function() {
   // your stuff goes here
});

Solution 12 - Jquery

Try something like this:

<form action="/" id="searchForm">
<input type="text" name="s" placeholder="Search...">
<input type="submit" value="Search">
</form>
<!-- the result of the search will be rendered inside this div -->
<div id="result"></div>

<script>
// Attach a submit handler to the form
$( "#searchForm" ).submit(function( event ) {

  // Stop form from submitting normally
event.preventDefault();

// Get some values from elements on the page:
var $form = $( this ),
term = $form.find( "input[name='s']" ).val(),
url = $form.attr( "action" );

// Send the data using post
var posting = $.post( url, { s: term } );

// Put the results in a div
posting.done(function( data ) {
  var content = $( data ).find( "#content" );
  $( "#result" ).empty().append( content );
    });
  });
</script>

> Note the use of input[]

Solution 13 - Jquery

all inputs:

var inputs = $("#formId :input");

all buttons

var button = $("#formId :button")

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionJohn MagnoliaView Question on Stackoverflow
Solution 1 - JquerySelvakumar ArumugamView Answer on Stackoverflow
Solution 2 - JquerySrinivasan.SView Answer on Stackoverflow
Solution 3 - JquerycircusdeiView Answer on Stackoverflow
Solution 4 - JqueryAvnish alokView Answer on Stackoverflow
Solution 5 - JqueryIgor ParraView Answer on Stackoverflow
Solution 6 - JqueryMohamad HamoudayView Answer on Stackoverflow
Solution 7 - JqueryRon Sims IIView Answer on Stackoverflow
Solution 8 - JqueryJanView Answer on Stackoverflow
Solution 9 - Jqueryuser3770276View Answer on Stackoverflow
Solution 10 - JqueryAhmed JamalView Answer on Stackoverflow
Solution 11 - JqueryMarcoView Answer on Stackoverflow
Solution 12 - JquerySrinath ShahView Answer on Stackoverflow
Solution 13 - JqueryD.L.MANView Answer on Stackoverflow