양식 제출 후 Jquery 콜백을 수행하는 방법은 무엇입니까?


119

remote = true 인 간단한 양식이 있습니다.

이 양식은 실제로 HTML 대화 상자에 있으며 제출 버튼을 클릭하면 닫힙니다.

이제 양식이 성공적으로 제출 된 후 기본 HTML 페이지를 변경해야합니다.

나는 jQuery를 사용하여 이것을 시도했다. 그러나 이것은 양식 제출의 어떤 형태의 응답 후에 작업이 수행되는 것을 보장하지 않습니다.

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

// do the task here ..

});

양식이 성공적으로 제출 된 후에 만 ​​코드가 실행되도록 콜백을 첨부하려면 어떻게해야합니까? .success 또는 .complete 콜백을 양식에 추가하는 방법이 있습니까?


Ajax를 사용하지 않는 이유는 무엇입니까? jQuery Ajax 함수를 사용하면 이러한 콜백을 정의 할 수 있습니다.
davidbuzatto

12
davidbuzatto, ajax를 사용할 수없는 경우가 있습니다. 예를 들어 파일을 업로드하고 싶을 때.
Pere

3
@Pere 미래에는 사실이 아닙니다.
SparK

답변:


119

방금 했어요-

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

         // tasks to do 


   });

그리고 모든 것이 완벽하게 작동했습니다.

자세한 내용은 이 API 문서 를 참조하세요.


3
와우 ... 방금 새로운 걸 배웠어요. 예, 외관상 가장 간단한 해결책입니다. 아마도 최고 일 것입니다. 저는 Coding Horror의 열렬한 독자입니다. 그 블로그에서 Jeff Attwood는 우리가 적은 코드를 작성해야한다고 강조하며,이 방법은이를 달성합니다. 잘 찾았습니다. :)

7
그리고 <form>일반적으로 제출되는 경우? (내 말은 Ajax가 아님을 의미) 첫 번째 인수에 .bind()무엇을 넣을 수 있습니까? 편집 : 글쎄, 나는 추측한다 click. Nvm, 죄송합니다. : p
4wk_ 2013

9
주의 : 이것은 양식 제출뿐만 아니라 모든 ajax 이벤트 완료 후 함수를 실행합니다 (오해하지 않는 한,이 경우 발견 한 위치에 대한 링크를 제공하고 싶습니다)
DMac 파괴자

18
"jQuery 1.8부터 .ajaxComplete () 메소드는 문서에만 첨부되어야합니다."
Meredith

6
버튼이있는 일반 양식을 사용하여 작동하지 않았지만 버튼은 javascript $ ( '# formFile'). submit ();
Daniel

35

신뢰할 수있는 작동을 위해 최고의 추천 솔루션을 얻을 수 없었지만이 방법이 효과가 있음을 발견했습니다. 필요한지 여부는 확실하지 않지만 태그에 작업 또는 메서드 속성이 없으므로 POST가 $ .ajax 함수에 의해 처리되고 콜백 옵션이 제공됩니다.

<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. 이 대답의 핵심은 $(this).serialize()선입니다. 이를 사용 jQuery.ajax()하여 백그라운드에서 기존 양식을 제출 한 다음 서버에서 응답을 받아 작업을 수행 할 수 있습니다.
Warren Young

15
세미콜론이없는 자바 스크립트 ... 어떤 사람들은 세상이 타는 것을보고 싶어합니다. 귀하의 솔루션은 :) 감사 있도록,하지만 작동
viggity

2
참고 .serialize게시 된 요청에 파일 입력을 포함하지 않습니다. HTML5의 FormData를 사용합니다 ( 이 질문에 당신이 IE <9와 같은 오래된 브라우저를 지원하는 대신하지 않는 한)
brichins

사용 소품 $(this).serialize(), 내 문제를 해결했습니다!
gnclmorais 2016-06-29

js에서 참조하는 HTML의 'form_selector'는 무엇입니까?
Kevin Meredith

23

서버에 대한 AJAX 호출을 사용하여 수동으로 작업을 수행해야합니다. 이 경우 양식도 재정의해야합니다.

그러나 걱정하지 마십시오. 케이크 조각입니다. 다음은 양식 작업 방법에 대한 개요입니다.

  • 기본 제출 작업을 재정의합니다 ( preventDefault메서드 가있는 전달 된 이벤트 개체 덕분에 ).
  • 양식에서 필요한 모든 값을 가져옵니다.
  • HTTP 요청 시작
  • 요청에 대한 응답 처리

먼저 다음과 같이 양식 제출 작업을 취소해야합니다.

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

그런 다음 데이터의 가치를 파악하십시오. 텍스트 상자가 하나 있다고 가정 해 보겠습니다.

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

그런 다음 요청을 시작하십시오. POST 요청이라고 가정하겠습니다.

$("#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.
    });
});

그리고 이것은 그것을해야합니다.

참고 2 : 양식의 데이터를 구문 분석하려면 플러그인 을 사용하는 것이 좋습니다. . 실제 양식 제출 작업을 모방하는 멋진 의미를 제공 할뿐만 아니라 삶을 정말 쉽게 만들 것입니다.

참고 2 : 지연을 사용할 필요가 없습니다. 그것은 단지 개인적인 취향입니다. 똑같이 다음을 수행 할 수 있으며 작동합니다.

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

2
훌륭한 샘플. 파일 업로드 (다중 파트 / 양식 데이터)로 동일한 작업을 수행하는 방법 ???
Adam W

11

MVC의 경우 여기에 훨씬 더 쉬운 접근 방식이 있습니다. Ajax 양식을 사용하고 AjaxOptions를 설정해야합니다.

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

여기에 제출 코드가 있습니다. 이것은 문서 준비 섹션에 있으며 버튼의 onclick 이벤트를 연결하여 양식을 제출합니다.

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

다음은 AjaxOptions에서 참조하는 콜백입니다.

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

MVC의 컨트롤러 메서드에서 다음과 같이 보입니다.

[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
해당 코드는 .Net 코드이며 질문에서 지정하지 않았습니다.
MrMins

13
그것은 정말로 이것을 반대 투표하는 좋은 이유가 아닙니다. 대답은 작동하며 동일한 문제에 직면 한 .NET 개발자에게 도움이 될 수 있습니다.
edepperson 2014 년

이 아이디어가 마음에 들지만 어떤 이유로 콜백이 실행되지 않습니다. 컨트롤러 메서드가 JsonResult를 반환해야합니까? 내 컨트롤러 메서드는 현재 ActionResult를 반환합니다.
mattpm

7

나는 당신이 설명하는 것과 같은 콜백 함수가 있다고 생각하지 않습니다.

여기서 정상적인 것은 PHP와 같은 서버 측 언어를 사용하여 변경하는 것입니다.

예를 들어 PHP에서는 양식에서 숨겨진 필드를 가져오고있는 경우 일부 변경을 수행 할 수 있습니다.

PHP :

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

Jquery에서이를 해결하는 한 가지 방법은 Ajax를 사용하는 것입니다. 제출을 듣고 false를 반환하여 기본 동작을 취소하고 대신 jQuery.post ()를 사용할 수 있습니다. jQuery.post에는 성공 콜백이 있습니다.

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

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


0

양식이 제출되기 전에 양식의 "제출시"핸들러가 호출됩니다. 양식 제출 후 호출 할 핸들러가 있는지 모르겠습니다. 전통적인 비 자바 스크립트 의미에서 양식 제출은 페이지를 다시로드합니다.


양식 제출이 파일 다운로드로 리디렉션되지 않는 한, 페이지는 그대로 유지됩니다. Ajax 요청이 파일 다운로드 (앵커 태그 게임없이)를 시작할 수 없기 때문에 JavaScript 제출을 사용할 수 없지만 사용자에게 파일이 있으면 기다리거나 정리하라고 말할 수 없습니다.
kitsu .eb

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

3
ajaxForm()설치 한 타사 구성 요소? jQuery의 표준 부분이 아닙니다.
Warren Young
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.