Làm cách nào để thực hiện Gọi lại Jquery sau khi gửi biểu mẫu?


119

Tôi có một biểu mẫu đơn giản với remote = true.

Biểu mẫu này thực sự nằm trên Hộp thoại HTML, sẽ đóng lại ngay khi nhấp vào nút Gửi.

Bây giờ tôi cần thực hiện một số thay đổi trên trang HTML chính sau khi biểu mẫu được gửi thành công.

Tôi đã thử điều này bằng cách sử dụng jQuery. Nhưng điều này không đảm bảo rằng các nhiệm vụ được thực hiện sau một số hình thức phản hồi của việc gửi biểu mẫu.

$("#myform").submit(function(event) {

// do the task here ..

});

Làm cách nào để đính kèm một lệnh gọi lại, để mã của tôi chỉ được thực thi sau khi biểu mẫu được gửi thành công? Có cách nào để thêm một số lệnh gọi lại .success hoặc .complete vào biểu mẫu không?


Tại sao bạn không sử dụng Ajax? Với các hàm jQuery Ajax, bạn có thể xác định các lệnh gọi lại như vậy.
davidbuzatto,

12
davidbuzatto, có một số trường hợp bạn không thể sử dụng ajax. Ví dụ, khi bạn muốn tải lên một tệp.
Pere

3
@Pere Không đúng ở đây trong tương lai.
SparK

Câu trả lời:


119

Tôi vừa làm điều này -

 $("#myform").bind('ajax:complete', function() {

         // tasks to do 


   });

Và mọi thứ đã hoạt động hoàn hảo.

Xem tài liệu api này để biết thêm chi tiết cụ thể.


3
Wow ... Tôi vừa học được một điều mới. Vâng, từ vẻ ngoài của nó, đây là giải pháp đơn giản nhất. Có lẽ, nó thậm chí là tốt nhất. Tôi là một người thích đọc Coding Horror và trong blog đó, Jeff Attwood nhấn mạnh rằng chúng ta nên viết ít mã hơn, và phương pháp này đạt được điều đó. Tốt tìm thấy. :)
Sal

7
Và nếu cái <form>được nộp thường xuyên? (Ý tôi là không phải với Ajax) Tôi có thể đưa ra đối số đầu tiên là .bind()gì? EDIT: tốt, tôi đoán click. Nvm, xin lỗi. : p
4wk_

9
hãy cẩn thận: điều này sẽ kích hoạt chức năng của bạn sau khi hoàn thành bất kỳ sự kiện ajax nào , không chỉ là việc gửi biểu mẫu của bạn (trừ khi tôi nhầm lẫn, trong trường hợp đó, tôi muốn bạn cung cấp liên kết đến nơi bạn tìm thấy điều này)
DMac the Destroyer,

18
"Kể từ jQuery 1.8, phương thức .ajaxComplete () chỉ nên được đính kèm vào tài liệu"
Meredith

6
Tôi không làm việc với biểu mẫu, sử dụng Biểu mẫu bình thường, với một nút, nhưng nút gọi javascript $ ('# formFile'). Submit ();
Daniel

35

Tôi không thể làm cho giải pháp được ủng hộ số một hoạt động đáng tin cậy, nhưng tôi đã tìm thấy giải pháp này hoạt động hiệu quả. Không chắc liệu nó có bắt buộc hay không, nhưng tôi không có thuộc tính action hoặc method trên thẻ, điều này đảm bảo POST được xử lý bởi hàm $ .ajax và cung cấp cho bạn tùy chọn gọi lại.

<form id="form">
...
<button type="submit"></button>
</form>

<script>
$(document).ready(function() {
  $("#form_selector").submit(function() {

    $.ajax({
     type: "POST",
      url: "form_handler.php",
      data: $(this).serialize(),
      success: function() {
        // callback code here
       }
    })

  })
})
</script>

1
+1. Chìa khóa cho câu trả lời này là $(this).serialize()dòng. Nó cho phép bạn sử dụng jQuery.ajax()để gửi biểu mẫu hiện có ở chế độ nền, sau đó bắt phản hồi từ máy chủ và làm điều gì đó với nó.
Warren Young

15
javascript không có dấu chấm phẩy ... một số người chỉ muốn xem thế giới bùng cháy. Giải pháp của bạn mặc dù hoạt động, vì vậy cảm ơn :)
viggity

2
Lưu ý rằng .serializekhông bao gồm đầu vào tệp trong yêu cầu ĐÃ ĐĂNG của bạn. Sử dụng HTML5 FormData (xem câu hỏi này ) thay vì trừ khi bạn đang hỗ trợ các trình duyệt cũ như IE <9
brichins

Đạo cụ để sử dụng $(this).serialize(), nó đã giải quyết vấn đề của tôi!
gnclmorais

'form_selector' trong html của bạn mà bạn tham chiếu trong js là gì?
Kevin Meredith,

23

Bạn sẽ phải thực hiện mọi việc theo cách thủ công với lệnh gọi AJAX tới máy chủ. Điều này cũng sẽ yêu cầu bạn ghi đè biểu mẫu.

Nhưng đừng lo lắng, đó là một miếng bánh. Dưới đây là tổng quan về cách bạn sẽ làm việc với biểu mẫu của mình:

  • ghi đè hành động gửi mặc định (nhờ đối tượng sự kiện được chuyển vào, có một preventDefaultphương thức)
  • lấy tất cả các giá trị cần thiết từ biểu mẫu
  • kích hoạt một yêu cầu HTTP
  • xử lý phản hồi cho yêu cầu

Trước tiên, bạn sẽ phải hủy hành động gửi biểu mẫu như sau:

$("#myform").submit(function(event) {
    // Cancels the form's submit action.
    event.preventDefault();
});

Và sau đó, lấy giá trị của dữ liệu. Hãy giả sử bạn có một hộp văn bản.

$("#myform").submit(function(event) {
    event.preventDefault();
    var val = $(this).find('input[type="text"]').val();
});

Và sau đó đưa ra một yêu cầu. Hãy giả sử đó là một yêu cầu ĐĂNG.

$("#myform").submit(function(event) {
    event.preventDefault();
    var val = $(this).find('input[type="text"]').val();

    // I like to use defers :)
    deferred = $.post("http://somewhere.com", { val: val });

    deferred.success(function () {
        // Do your stuff.
    });

    deferred.error(function () {
        // Handle any errors here.
    });
});

Và điều này nên làm điều đó.

Lưu ý 2: Để phân tích cú pháp dữ liệu của biểu mẫu, bạn nên sử dụng plugin . Nó sẽ làm cho cuộc sống của bạn thực sự dễ dàng, cũng như cung cấp một ngữ nghĩa tốt đẹp bắt chước một hành động gửi biểu mẫu thực tế.

Lưu ý 2: Bạn không nhất thiết phải sử dụng bộ khử âm. Nó chỉ là một sở thích cá nhân. Bạn cũng có thể làm những việc sau và nó cũng sẽ hiệu quả.

$.post("http://somewhere.com", { val: val }, function () {
    // Start partying here.
}, function () {
    // Handle the bad news here.
});

2
Mẫu tuyệt vời. Làm thế nào để làm điều tương tự với tải lên tệp (đa phần / biểu mẫu-dữ liệu) ???
Adam W

11

Đối với MVC, đây là một cách tiếp cận thậm chí còn dễ dàng hơn. Bạn cần sử dụng biểu mẫu Ajax và đặt AjaxOptions

@using (Ajax.BeginForm("UploadTrainingMedia", "CreateTest", new AjaxOptions() { HttpMethod = "POST", OnComplete = "displayUploadMediaMsg" }, new { enctype = "multipart/form-data", id = "frmUploadTrainingMedia" }))
{ 
  ... html for form
}

đây là mã gửi, đây là trong phần sẵn sàng tài liệu và liên kết sự kiện onclick của nút để gửi biểu mẫu

$("#btnSubmitFileUpload").click(function(e){
        e.preventDefault();
        $("#frmUploadTrainingMedia").submit();
});

đây là lệnh gọi lại được tham chiếu trong AjaxOptions

function displayUploadMediaMsg(d){
    var rslt = $.parseJSON(d.responseText);
    if (rslt.statusCode == 200){
        $().toastmessage("showSuccessToast", rslt.status);
    }
    else{
        $().toastmessage("showErrorToast", rslt.status);
    }
}

trong phương thức điều khiển cho MVC, nó trông giống như thế này

[HttpPost]
[ValidateAntiForgeryToken]
public JsonResult UploadTrainingMedia(IEnumerable<HttpPostedFileBase> files)
{
    if (files != null)
    {
        foreach (var file in files)
        {
            // there is only one file  ... do something with it
        }
        return Json(new
        {
            statusCode = 200,
            status = "File uploaded",
            file = "",
        }, "text/html");
    }
    else
    {
        return Json(new
        {
            statusCode = 400,
            status = "Unable to upload file",
            file = "",
        }, "text/html");
    }
}

2
Những mã đó là mã .Net và trong câu hỏi không bao giờ chỉ định nó.
MrMins

13
Đó thực sự không phải là lý do chính đáng để bỏ phiếu bầu chọn này. Câu trả lời hoạt động và có thể giúp một nhà phát triển .NET đang gặp phải vấn đề tương tự.
edepperson

Tôi thích ý tưởng này, nhưng vì một số lý do mà lệnh gọi lại không kích hoạt. Phương thức điều khiển có phải trả về một JsonResult không? Phương thức bộ điều khiển của tôi hiện trả về một ActionResult.
mattpm 17/09/19

7

Tôi không tin là có một hàm gọi lại như bạn mô tả.

Điều bình thường ở đây là thực hiện các thay đổi bằng cách sử dụng một số ngôn ngữ phía máy chủ, như PHP.

Trong PHP, ví dụ, bạn có thể tìm nạp một trường ẩn từ biểu mẫu của mình và thực hiện một số thay đổi nếu nó hiện diện.

PHP:

  $someHiddenVar = $_POST["hidden_field"];
    if (!empty($someHiddenVar)) {
        // do something 
    }

Một cách để thực hiện nó trong Jquery là sử dụng Ajax. Bạn có thể nghe gửi, trả về false để hủy hành vi mặc định của nó và sử dụng jQuery.post () để thay thế. jQuery.post có một cuộc gọi lại thành công.

$.post("test.php", $("#testform").serialize(), function(data) {
  $('.result').html(data);
});

http://api.jquery.com/jQuery.post/


0

Các trình xử lý "khi gửi" của biểu mẫu được gọi trước khi biểu mẫu được gửi. Tôi không biết liệu có trình xử lý nào được gọi sau khi biểu mẫu được gửi hay không. Theo nghĩa truyền thống không phải Javascript, việc gửi biểu mẫu sẽ tải lại trang.


Trừ khi việc gửi biểu mẫu chuyển hướng đến tải xuống tệp, trong trường hợp đó, trang được giữ nguyên. Tôi không thể sử dụng gửi JavaScript vì yêu cầu Ajax không thể bắt đầu tải xuống tệp (không có trò chơi gắn thẻ neo), nhưng tôi cũng không thể yêu cầu người dùng đợi hoặc dọn dẹp sau khi họ có tệp ...
kitsu .eb

-1
$("#formid").ajaxForm({ success: function(){ //to do after submit } });

3
ajaxForm()một thành phần của bên thứ ba mà bạn đã cài đặt? Nó không phải là một phần tiêu chuẩn của jQuery.
Warren Young
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.