Gửi biểu mẫu bằng jQuery [đã đóng]


476

Tôi muốn gửi một biểu mẫu bằng jQuery. Ai đó có thể cung cấp mã, bản demo hoặc liên kết ví dụ không?

Câu trả lời:


482

Nó phụ thuộc vào việc bạn gửi biểu mẫu bình thường hay thông qua cuộc gọi AJAX. Bạn có thể tìm thấy nhiều thông tin tại jquery.com , bao gồm cả tài liệu với các ví dụ. Để gửi biểu mẫu thông thường, hãy kiểm tra submit()phương pháp tại trang web đó. Đối với AJAX , có nhiều khả năng khác nhau, mặc dù bạn có thể muốn sử dụng ajax()hoặc post()phương thức. Lưu ý rằng đó post()thực sự chỉ là một cách thuận tiện để gọi ajax()phương thức với giao diện đơn giản và hạn chế.

Một tài nguyên quan trọng, một tài nguyên tôi sử dụng hàng ngày, mà bạn nên đánh dấu là Cách jQuery hoạt động . Nó có các hướng dẫn về cách sử dụng jQuery và điều hướng bên trái cho phép truy cập vào tất cả các tài liệu.

Ví dụ:

Bình thường

$('form#myForm').submit();

AJAX

$('input#submitButton').click( function() {
    $.post( 'some-url', $('form#myForm').serialize(), function(data) {
         // ... do something with response from server
       },
       'json' // I expect a JSON response
    );
});

$('input#submitButton').click( function() {
    $.ajax({
        url: 'some-url',
        type: 'post',
        dataType: 'json',
        data: $('form#myForm').serialize(),
        success: function(data) {
                   // ... do something with the data...
                 }
    });
});

Lưu ý rằng ajax()post()các phương pháp trên là tương đương. Có các tham số bổ sung mà bạn có thể thêm vào ajax()yêu cầu để xử lý lỗi, v.v.


3
Tôi đã thiếu phương pháp tuần tự hóa. Rõ ràng, tôi đã xem jQuery.com, nhưng tài liệu của họ về $.postgiải mã rõ ràng và tái cấu trúc biểu mẫu để tạo dữ liệu để gửi. Cảm ơn!
Tên của

1
Nếu tôi có sẵn một số dữ liệu, tôi muốn thêm vào yêu cầu bài đăng (không phải ajax, mẫu gửi yêu cầu bài đăng) trước khi gửi, làm thế nào để tôi làm điều đó?
ア レ ッ

1
@AlexanderSupertramp - trong ví dụ trên, dữ liệu đang được gửi dưới dạng tham số biểu mẫu được mã hóa url. Bạn chỉ có thể nối thêm dữ liệu dưới dạng tham số biểu mẫu bổ sung. $('form#MyForm').serialize() + '&newData=' + newData + '&moreData=' + moreData. Lưu ý: hai cái sau có thể cần được mã hóa url bằng cách sử dụng encodeURIComponent(). HOẶC - bạn có thể thay đổi để sử dụng mã hóa JSON ở cả hai đầu nhưng sau đó bạn cần đưa dữ liệu biểu mẫu vào cấu trúc dữ liệu JavaScript với dữ liệu bổ sung của mình và tuần tự hóa nó. Trong trường hợp đó, bạn có thể sử dụng serializeArraytrên biểu mẫu và hợp nhất dữ liệu khác của bạn vào.
tvanfosson

"Tôi mong đợi một phản hồi json" đã giải quyết một vấn đề khác cho tôi (re: các cuộc gọi đến Flask không thành công).
scharfmn

Nếu bạn có một nút gửi có tên 'submit', điều này sẽ lặng lẽ thất bại (jQuery) hoặc gây ra lỗi "gửi không phải là một chức năng" (vanilla js). Đổi tên nút thành bất cứ điều gì khác sẽ giải quyết . _ (ツ) _ / ¯ 🤷
fzzylogic

122

Bạn sẽ phải sử dụng $("#formId").submit().

Bạn thường gọi nó từ trong một chức năng.

Ví dụ:

<input type='button' value='Submit form' onClick='submitDetailsForm()' />

<script language="javascript" type="text/javascript">
    function submitDetailsForm() {
       $("#formId").submit();
    }
</script>

Bạn có thể nhận thêm thông tin về điều này trên trang web của Jquery .


55
Nếu bạn đang sử dụng jQuery, tại sao bạn lại sử dụng thuộc tính onclick nội tuyến?
nnnnnn

3
@BradleyFlood - Làm thế nào anh ấy nên làm điều đó thay thế? Những người mới như chúng tôi muốn biết?
MarcoZen

2
@MarcoZen Tôi nghĩ BradleyFlood đã chỉ ra rằng cụm từ "Ví dụ:" có nghĩa là sử dụng thuộc tính onclick nội tuyến là một trong một số cách có thể. Thật vậy, nhiều jQuery giống như sẽ sử dụng .on ('click', submitDetailsForm).
Jan Kukacka

@JanKukacka - Lưu ý. Cảm ơn.
MarcoZen

71

khi bạn có một biểu mẫu hiện có, giờ đây nó sẽ hoạt động với jquery - ajax / bài viết bây giờ bạn có thể:

  • treo lên trình - sự kiện của mẫu của bạn
  • ngăn chặn chức năng mặc định của trình
  • làm công việc của riêng bạn

    $(function() {
        //hang on event of form with id=myform
        $("#myform").submit(function(e) {
    
            //prevent Default functionality
            e.preventDefault();
    
            //get the action-url of the form
            var actionurl = e.currentTarget.action;
    
            //do your own request an handle the results
            $.ajax({
                    url: actionurl,
                    type: 'post',
                    dataType: 'application/json',
                    data: $("#myform").serialize(),
                    success: function(data) {
                        ... do something with the data...
                    }
            });
    
        });
    
    });

Xin lưu ý rằng, để serialize()hàm hoạt động trong ví dụ trên, tất cả các thành phần của biểu mẫu cần phải namexác định thuộc tính của chúng .

Ví dụ về hình thức:

<form id="myform" method="post" action="http://example.com/do_recieve_request">

<input type="text" size="20" value="default value" name="my_input_field">
..
.
</form>

@PtF - dữ liệu được gửi bằng POST trong mẫu này, vì vậy điều này có nghĩa là bạn có thể truy cập dữ liệu của mình thông qua

 $_POST['dataproperty1'] 

, trong đó dataproperty1 là "tên biến" trong json của bạn.

cú pháp mẫu ở đây nếu bạn sử dụng CodeIgniter:

 $pdata = $this->input->post();
 $prop1 = $pdata['prop1'];
 $prop1 = $pdata['prop2'];

Tại sao bạn sử dụng lại bộ chọn của biểu mẫu, tại sao không sử dụng lại chính phần tử biểu mẫu?
Slava Fomin II

vâng, bạn cũng có thể làm như vậy: <form id = "myform" onsubmit = "do_ ware ()">, nhưng nếu js được tải sau / defered thì chức năng đó có thể không khả dụng .. vì vậy tôi nghĩ khởi tạo điều này trên tài liệu. sẵn sàng .... tôi không chắc là tôi có cùng suy nghĩ không, bạn có thể minh họa bạn đang ở đâu không?
womd

1
Cảm ơn vì đã nhấn mạnh rằng thuộc tính "tên" phải được xác định
ccalboni

1
DataType: 'application / json' là một lỗi. Nên đọc dữ liệu Loại: 'json'. Bạn sẽ gặp lỗi phân tích cú pháp nếu để lại như trong ví dụ trên.
Hankster

@Hankster có, là json nhưng đã được chỉnh sửa ... Hollander bạn có thể kiểm tra / xác nhận không?
womd

68

Trong jQuery tôi muốn như sau:

$("#form-id").submit()

Nhưng một lần nữa, bạn thực sự không cần jQuery để thực hiện nhiệm vụ đó - chỉ cần sử dụng JavaScript thông thường:

document.getElementById("form-id").submit()

1
@windmaomao bạn đã bao gồm jQuery trên trang web của bạn chưa? Tuy nhiên, có thể bạn cần sử dụng jQuery istead của $ aswell - Tôi khuyên bạn nên sử dụng giải pháp JS thông thường trừ khi bạn đã có jQuery đi kèm.
gernberg

1
@windmaomao Mình cũng gặp vấn đề tương tự. JQuery của tôi đã chạy tất cả các chức năng khác, nhưng sẽ không gửi biểu mẫu. Nó hoạt động bằng cách chỉ sử dụng phương thức document.getEuityById.
Thử thách được chấp nhận vào


22

Để biết thông tin
nếu có ai sử dụng

$('#formId').submit();

Đừng như thế này

<button name = "submit">

Phải mất nhiều giờ để tìm thấy tôi mà trình () sẽ không hoạt động như thế này.


1
Typo trên từ khóa "sumit"làm cho nó không rõ ràng nếu lỗi đánh máy là không có ý định trong câu trả lời, hoặc có liên quan đến vấn đề. Bạn có nghĩa là một nút có tên gây "submit"rối mẫu jquery gửi ()? Hay bạn có nghĩa là vấn đề là bạn đã gửi tên nút thay vì tiêu chuẩn type="submit"?
Daryn

ý định của tôi không phải là trả lời câu hỏi này mà là nói với những người phải đối mặt với vấn đề này. Tôi nghĩ vấn đề là với tên nút không có loại được xác định, vì tôi đã sử dụng sự kiện onclick để kiểm tra một số đầu vào trước khi gửi. Nếu loại = gửi thì mẫu gửi mà không có sự kiện onclick của tôi.
AZ Soft

16

Sử dụng nó để gửi biểu mẫu của bạn bằng cách sử dụng jquery. Đây là liên kết http://api.jquery.com/submit/

<form id="form" method="post" action="#">
    <input type="text" id="input">
    <input type="button" id="button" value="Submit">
</form>

<script type="text/javascript">
$(document).ready(function () {
    $( "#button" ).click(function() {
        $( "#form" ).submit();
    });
});
</script>

2
Mặc dù đây là một bài viết cũ, nhưng đáng để thêm một loại buttonvào nút của bạn để đảm bảo biểu mẫu không gửi (vì không phải tất cả các trình duyệt đều xử lý các nút không có loại giống nhau).
Mikey

@Mikey Cảm ơn bạn đã gợi ý.
Chintan Thummar

14

điều này sẽ gửi một biểu mẫu với trình tải trước:

var a=$('#yourform').serialize();
$.ajax({
    type:'post',
    url:'receiver url',
    data:a,
    beforeSend:function(){
        launchpreloader();
    },
    complete:function(){
        stopPreloader();
    },
    success:function(result){
         alert(result);
    }
});

Tôi có một số mẹo để tạo một bài đăng dữ liệu biểu mẫu được cải cách bằng phương thức ngẫu nhiên http://www.jackart4.com/article.html


bạn có thể gửi liên kết cập nhật? Các liên kết ở trên không còn hoạt động.
Chris22


12

Lưu ý rằng nếu bạn đã cài đặt trình lắng nghe sự kiện cho biểu mẫu của mình, cuộc gọi bên trong để gửi ()

jQuery('#<form-id>').submit( function(e){ 
    e.preventDefault();
    // maybe some validation in here
    if ( <form-is-valid> ) jQuery('#<form-id>').submit();
});

sẽ không hoạt động vì nó cố gắng cài đặt một trình lắng nghe sự kiện mới cho sự kiện gửi biểu mẫu này (không thành công). Vì vậy, bạn phải gia nhập chính Phần tử HTML (mở khóa từ jQquery) và gọi trực tiếp submit () trên thành phần này:

    jQuery('#<form-id>').submit( function(e){ 
      e.preventDefault();
      // note the [0] array access:
      if ( <form-is-valid> ) jQuery('#<form-id>')[0].submit();
    });


7
jQuery("a[id=atag]").click( function(){

    jQuery('#form-id').submit();      

            **OR**

    jQuery(this).parents("#form-id").submit();
});

7

Lưu ý rằng trong Internet Explorer có vấn đề với các biểu mẫu được tạo động. Một biểu mẫu được tạo như thế này sẽ không gửi trong IE (9):

var form = $('<form method="post" action="/test/Delete/">' +
             '<input type="hidden" name="id" value="' + myid + '"></form>');
$(form).submit();

Để làm cho nó hoạt động trong IE, hãy tạo phần tử biểu mẫu và đính kèm nó trước khi gửi như vậy:

var form = document.createElement("form");
$(form).attr("action", "/test/Delete")
       .attr("method", "post");
$(form).html('<input type="hidden" name="id" value="' + myid + '" />');
document.body.appendChild(form);
$(form).submit();
document.body.removeChild(form);

Tạo biểu mẫu như trong ví dụ 1 và sau đó đính kèm nó sẽ không hoạt động - trong IE9, nó đưa ra lỗi JScript DOM Exception: HIERARCHY_REQUEST_ERR (3)

Đạo cụ cho Tommy W @ https://stackoverflow.com/a/6694054/694325


7

Các giải pháp cho đến nay yêu cầu bạn phải biết ID của biểu mẫu.

Sử dụng mã này để gửi biểu mẫu mà không cần biết ID:

function handleForm(field) {
    $(field).closest("form").submit();
}

Ví dụ: nếu bạn muốn xử lý sự kiện nhấp chuột cho một nút, bạn có thể sử dụng

$("#buttonID").click(function() {
    handleForm(this);    
});

6

Nếu nút nằm giữa các thẻ biểu mẫu, tôi thích phiên bản này:

$('.my-button').click(function (event) {
    var $target = $( event.target );
    $target.closest("form").submit();
});



3

Cách tiếp cận của tôi hơi khác Thay đổi nút thành nút gửi và sau đó nhấp

$("#submit").click(function(event) {
$(this).attr('type','submit');
$(this).click();
});

2
function  form_submit(form_id,filename){
    $.post(filename,$("#"+form_id).serialize(), function(data){
        alert(data);
    });
}

Nó sẽ đăng dữ liệu biểu mẫu trên tên tệp đã cho của bạn thông qua AJAX.


1

Tôi đề xuất một giải pháp chung để bạn không phải thêm mã cho mọi hình thức. Sử dụng plugin mẫu jquery (http://jquery.malsup.com/form/) và thêm mã này.

$(function(){
$('form.ajax_submit').submit(function() {
    $(this).ajaxSubmit();
            //validation and other stuff
        return false; 
});

});

1

bạn có thể làm như thế này:

$('#myform').bind('submit', function(){ ... });

-2

Tôi cũng đã sử dụng cách sau để gửi biểu mẫu (mà không thực sự gửi nó) thông qua Ajax:

  jQuery.get("process_form.php"+$("#form_id").serialize(), {}, 
    function() {
      alert("Okay!"); 
    });

3
đây không phải là bất cứ điều gì giống như một đệ trình (). đối với một điều, submit () sử dụng ngữ nghĩa POST, bạn đang sử dụng GET
Scott Evernden
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.