jquery lấy tất cả các phần tử biểu mẫu: input, textarea & select


108

Có cách nào dễ dàng (mà không liệt kê tất cả chúng một cách riêng biệt) trong jquery để chọn tất cả các phần tử biểu mẫu và chỉ các thành phần biểu mẫu.

Tôi không thể sử dụng con (), v.v. vì biểu mẫu chứa HTML khác.

Ví dụ:

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

Câu trả lời:


179

Chỉnh sửa: Như đã chỉ ra trong nhận xét ( Mario Awad & Brock Hensley ), sử dụng .findđể có được trẻ em

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

các biểu mẫu cũng có một bộ sưu tập các phần tử, đôi khi điều này khác với các phần tử con, chẳng hạn như khi thẻ biểu mẫu nằm trong một bảng và không được đóng.


Có thể là : bộ chọn đầu vào là những gì bạn muốn

$ ("form"). each (function () {$ (': input', this) // <- Nên trả về tất cả các phần tử đầu vào ở dạng cụ thể đó.});

Như đã chỉ ra trong tài liệu

Để đạt được hiệu suất tốt nhất khi sử dụng: input để chọn phần tử, trước tiên hãy chọn phần tử bằng bộ chọn CSS thuần túy, sau đó sử dụng .filter (": input").

Bạn có thể sử dụng như bên dưới,

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


3
Cảm ơn mặc dù sau khi đọc: api.jquery.com/input-selector hiệu suất là một vấn đề tôi cũng có thể liệt kê chúng. Thông tin cần biết mặc dù có thể của nó
John Magnolia

8
Là nó chỉ cho tôi hay điều này không hoạt động cho select? EDIT: nevermind, làm việc với chọn nếu tôi sử dụngfind(':input')
Brock Hensley

1
Bạn phải sử dụng "find" thay vì "filter" ở đây vì "filter" không thể hoạt động trên một phần tử (trong trường hợp này là phần tử "this"). Sử dụng "bộ lọc", bạn sẽ không thể chọn bất kỳ phần tử biểu mẫu nào và không chỉ "chọn" các phần tử. Cảm ơn @Brock Hensley đã chỉ ra điều này.
Mario Awad

Làm thế nào về các hình thức lớn? Tôi có một biểu mẫu khổng lồ với hơn 4000 phần tử trong đó và bộ chọn này rất chậm. Trong thông số kỹ thuật được viết rằng: đầu vào không được trình duyệt tối ưu hóa bởi CSS3, vì vậy không hoạt động với tôi: /. Bất kỳ ý tưởng khác?
Vasil Popov

@VasilPopov Phần trên có thể quá chậm đối với bạn. Bạn có thể thử một số giải pháp, theo cách bạn cần nhóm ít phần tử hơn và chọn chúng.
Selvakumar Arumugam

52

Đoạn mã dưới đây giúp lấy chi tiết các phần tử từ biểu mẫu cụ thể với id biểu mẫu,

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

Đoạn mã dưới đây giúp lấy chi tiết các phần tử từ tất cả các biểu mẫu được đặt trong trang tải,

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

Đoạn mã dưới đây giúp lấy thông tin chi tiết về các phần tử được đặt trong trang tải ngay cả khi phần tử không được đặt bên trong thẻ,

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

LƯU Ý: Chúng tôi thêm tên thẻ phần tử khác mà chúng tôi cần trong danh sách đối tượng như bên dưới,

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

Tại sao điều này lấy tất cả các giá trị và tùy chọn của một phần tử được chọn, thay vì đưa ra giá trị của một thứ đã được chọn hoặc cách khác để trống. ?
user2906838

11

Nếu bạn có các loại bổ sung, hãy chỉnh sửa bộ chọn:

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

Tất cả các phần tử biểu mẫu bây giờ đều ở trong mảng formElements.


7

Đối với bản ghi : Đoạn mã sau đây có thể giúp bạn biết chi tiết về đầu vào, vùng văn bản, lựa chọn, nút, thẻ thông qua tiêu đề tạm thời khi di chuột qua chúng.

nhập mô tả hình ảnh ở đây

$( '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 );
    } )
} );

Chức năng tuyệt vời! Cảm ơn
Mohamad Hamouday

6

jQuery giữ một tham chiếu đến phần tử biểu mẫu vani JS và điều này chứa một tham chiếu đến tất cả các phần tử con của biểu mẫu. Bạn có thể chỉ cần lấy tham chiếu và tiếp tục:

var someForm = $('#SomeForm');

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


5

Đây là chức năng yêu thích của tôi và nó hoạt động như một sự quyến rũ đối với tôi!

Nó trả về một đối tượng với tất cả cho dữ liệu input, select và textarea.

Và nó đang cố gắng lấy tên đối tượng bằng cách tìm tên phần tử khác Id else class.

var All_Data = Get_All_Forms_Data();
console.log(All_Data);

Chức năng:

function Get_All_Forms_Data(Element)
{
    Element = Element || '';
    var All_Page_Data = {};
    var All_Forms_Data_Temp = {};
    if(!Element)
    {
        Element = 'body';
    }

    $(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;
}

Tốt nhưng có một lỗi nhỏ trong "Element_Value = jQuery ('input [name ="' + Element_Name + '"]: đã kiểm tra'). Val ();". Element_Name thực sự có thể là id nút hoặc lớp, trong trường hợp đó nó sẽ không tìm thấy phần tử.
Rafael Werlang

1
Chính xác, tôi đã sửa nó!
Mohamad Hamouday

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

Tất cả các phần tử bao gồm nút gửi bây giờ nằm ​​trong biến $ form_elements.


2
Làm thế nào để bạn truy cập chúng?
Ngenazy


1

Hãy thử chức năng này

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

Và sử dụng nó như

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

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

Thưởng thức :)


0

Hãy thử một cái gì đó như sau:

<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>

Lưu ý việc sử dụng đầu vào []


này dường như không có được textareas hoặc chọn
pcarvalho

0

tất cả các đầu vào:

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

tất cả các nút

var button = $("#formId :button")
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.