How an I get all form elements (input, textarea & select) with jQuery?
JqueryJquery 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>
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
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.
$( '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")