Ajax 성공 이벤트가 작동하지 않습니다


194

등록 양식이 있고 $.ajax제출하는 데 사용 하고 있습니다.

이것은 내 AJAX 요청입니다.

$(document).ready(function() {
    $("form#regist").submit(function() {
        var str = $("#regist").serialize();
        $.ajax({
            type: 'POST',
            url: 'submit1.php',
            data: $("#regist").serialize(),
            dataType: 'json',
            success: function() {
                $("#loading").append("<h2>you are here</h2>");
            }        
        });
        return false;        
    });
});

내에서 submit1.php의 파일 나는 필드의 존재를 확인 이메일 주소사용자 이름 데이터베이스입니다. 해당 값이 페이지 새로 고침없이 존재하면 오류 메시지를 표시하고 싶습니다 .

AJAX 요청 의 성공 콜백에 이것을 어떻게 추가 할 수 있습니까?


2
성공 콜백이 호출 되었습니까?
rahul

두 번째 문제에 대해 새로운 질문을해야합니다.
Mike Lyons

답변:


390

결과는 아마도 JSON 형식이 아니므로 jQuery가 구문 분석하려고하면 실패합니다. error:콜백 함수로 오류를 잡을 수 있습니다 .

어쨌든 해당 기능에 JSON이 필요하지 않으므로 dataType: 'json'행 을 가져올 수도 있습니다 .


14
dataType을 text로 변경하고 작동하게했습니다. 이것처럼dataType:'text'
Magesh

+1도 가능하지만 내 코드가 아닌 서버에서 json 데이터를 서버에서 반환하여 해결했습니다.
albanx

4
dataType:지정되지 않은 경우에도 발생할 수 있지만로 url:끝납니다 .json.
davetapley

1
또한에 $.post공급 별칭 json서버에서 오는 실제 JSON없이 데이터 형식으로하지 트리거 않는 success콜백
baldrs

json ajax 요청을하려면 mime-type이 application / json으로 설정되어 있는지 확인하십시오. 그것은 나에게 문제를 주었다.
Gellweiler

19

문제가 이미 해결되었지만 다른 사람들에게 도움이되기를 바랍니다.

나는 실수를 이런 식으로 직접 사용하려고 시도했다 (성공 : OnSuccess (productID)). 그러나 먼저 익명 함수를 전달해야합니다.

  function callWebService(cartObject) {

    $.ajax({
      type: "POST",
      url: "http://localhost/AspNetWebService.asmx/YourMethodName",
      data: cartObject,
      contentType: "application/x-www-form-urlencoded",
      dataType: "html",
      success: function () {
        OnSuccess(cartObject.productID)
      },
      error: function () {
        OnError(cartObject.productID)
      },
      complete: function () {
        // Handle the complete event
        alert("ajax completed " + cartObject.productID);
      }
    });  // end Ajax        
    return false;
  }

랩퍼로 익명 함수를 사용하지 않으면 웹 서비스가 예외를 리턴하더라도 OnSuccess가 호출됩니다.


5
이것은 ajax, jquery 또는 핸들러와 관련이 없습니다. 우리는 "전체 코드가 스크립트 태그로 싸여있다"는 것을 상기시킬 수있다. 설명은 거짓이다 : 당신은 그것을 호출하는 대신 전달하는 한, 익명의 함수로 아무것도 감싸지 않아도된다. 또한 오해의 소지가 있습니다. 요청이 전송되기 전에 OnSuccess가 호출되므로 요청을 반환하는 웹 서비스와 관련이 없습니다.
fdreger

이 답변은 저에게 도움이되었지만 투표하지 않았으므로 @fdreger 의견에 따라 답변을 업데이트해야합니다.
Ozair Kafray

15

dataType 행을 제거하려고 시도했지만 작동하지 않았습니다. 콜백으로 "성공"대신 "완료"를 사용하여 문제를 해결했습니다. 성공 콜백은 여전히 ​​IE에서 실패하지만 스크립트가 실행되고 완료되기 때문에 어쨌든 그게 전부입니다.

$.ajax({
    type: 'POST',
    url: 'somescript.php',
    data: someData,
    complete: function(jqXHR) {
       if(jqXHR.readyState === 4) {
          ... run some code ... 
       }   
    }        
 });

jQuery 1.5에서는 이와 같이 할 수도 있습니다.

var ajax = $.ajax({
    type: 'POST',
    url: 'somescript.php',
    data: 'someData'
});
ajax.complete(function(jqXHR){
    if(jqXHR.readyState === 4) {
        ... run some code ... 
    }
});

9
이것에주의하십시오. 웹 서버가 HTTP 헤더로 응답하는 경우에만 호출되고 (모든 것이 정상 임) completeajax 호출의 성공 여부에 관계없이 항상 success호출됩니다 200 OK.
katalin_2003

10

PHP 파일에서 JSON 형식의 데이터를 생성하기 전에 텍스트 / 데이터를 인쇄 (에코 또는 인쇄)하지 않아야합니다. 그것은 당신이-성공적인 200 OK를 얻었음을 설명 할 수 있지만 당신의 성공 이벤트는 여전히 자바 스크립트에서 실패합니다. POST submit1.php에 대한 firebug의 "Network-Answer"섹션을 확인하여 스크립트가 수신 한 내용을 확인할 수 있습니다.


이것은 정말로 나를 도왔습니다. 나는 그것이 오래된 대답이라는 것을 알고 있지만 그것은 내가 겪었던 문제였습니다. 디버깅 중에 echo 또는 print_r을 사용하여 실제로 버그를 일으키는 지 확인합니다 ... :) 감사합니다!
lennyklb

6 년 후에도이 답변으로 사람들을 도와줍니다! 다른 곳을 찾아야 할 곳은 몰랐을 것입니다.
Tania Rascia

5

을 넣어 alert()당신에 success있는지가 전혀 호출되는 것 있도록 콜백.

그렇지 않은 경우 서버에 액세스 할 수 있지만 요청이 전혀 성공하지 못했기 때문입니다. 합리적인 원인은 시간 초과가 만료되거나 PHP 코드의 어떤 예외가 발생하기 때문일 수 있습니다.

파이어 폭스 용 파이어 버그 애드온을 아직 설치하지 않았다면 설치하고 AJAX 콜백을 검사하십시오. 응답 및 성공적인 (200 OK) 응답 수신 여부를 볼 수 있습니다. 콜백 에 다른 것을 넣을 수도 있습니다 alert(). complete콜백은 반드시 호출해야합니다.


답장을 보내 주셔서 감사합니다. 성공 이벤트에서 경고를 시도했지만 작동하지 않았습니다. 파이어 폭스 용 firebug addon이 있고 성공적인 (200 OK) 응답을 받으므로 아무런 문제가 없습니다. 오류에 대해 PHP 파일에서 die 함수가 있고 firebug에서 확인할 때 적절한 응답을 보여줍니다. "전체 콜백에 또 다른 alert ()을 넣을 수 있습니다. 확실히 호출해야합니다."?? 빠른 답변에 감사드립니다
codingbbq

2
에 경고 success가 표시되지 않으면 성공하지 못한 것입니다. 응답이 200 OK이므로 Tatu의 회신은 합리적이지만 추가 문제 해결을 complete위해 요청이 성공했는지 여부에 관계없이 항상 호출되는 다른 이벤트를 사용할 수 있습니다 (요청이 성공한 success경우에만 발생). complete: function (xhr, status) { alert('complete: '+status); }
David Hedlund

3

나는 같은 문제가 있었다. 데이터를 반환 javascript할 때 json데이터 형식 이 필요하기 때문에 발생 합니다. 그러나 PHP에서 echo 또는 print를 사용하면이 상황이 발생합니다. echo함수 를 사용 php하여 데이터를 반환하는 경우 dataType : "json"작업을 잘 제거하십시오 .


2

유효한 JSON을 반환하고 "완전한"콜백에서 200의 응답을 얻었고 크롬 네트워크 콘솔에서 볼 수 있었지만 지정하지 않았습니다.

dataType: "json"

일단 "허용 된 답변"과 달리 실제로 문제를 해결했습니다.


1

XML을 사용하여 서버의 PHP에서 웹 페이지로 결과를 다시 전달하고 있으며 동일한 동작을했습니다.

내 경우에는 그 이유는 닫기 태그가 시작 태그와 일치하지 않았기 때문입니다.

<?php
....
header("Content-Type: text/xml");
echo "<?xml version=\"1.0\" encoding=\"utf-8\"?>
    <result>
        <status>$status</status>
        <OPENING_TAG>$message</CLOSING_TAG>
    </result>";
?>

1

Magento에서 사용자 비밀번호를 복구하기 위해 ajax 기능을 사용 하여이 문제가 발생했습니다. 성공 이벤트가 시작되지 않은 다음 두 가지 오류가 있음을 깨달았습니다.

  1. 결과가 JSON 형식으로 반환되지 않았습니다
  2. 배열을 JSON 형식으로 변환하려고했지만이 배열에는 UTF 이외의 문자가 있습니다.

따라서 json_eoncde ()를 사용하여 반환 배열을 인코딩하려고 할 때마다 색인 중 하나에 UTF 이외의 문자가 있었기 때문에 함수가 작동하지 않았습니다. 대부분 브라질 포르투갈어 단어로 강조되었습니다.


1

컨트롤러에서 문자열을 반환하려고 시도했지만 제어가 Ajax의 성공이 아닌 오류 블록으로 돌아가는 이유

var sownum="aa";
$.ajax({
    type : "POST",
    contentType : 'application/json; charset=utf-8',
    dataType : "JSON",
    url : 'updateSowDetails.html?sownum=' + sownum,
    success : function() {
        alert("Wrong username");
    },
    error : function(request, status, error) {

        var val = request.responseText;
        alert("error"+val);
    }
});

1

성공 메시지를 반환하도록 컨트롤러를 수정했을 때 성공 응답을 반환하지 않는 컨트롤러를 쿼리 할 때도 동일한 문제에 직면했습니다. Lavalite 프레임 워크를 사용하는 것에주의하십시오. 전에:

public function Activity($id)
    {
        $data=getData();
        return
            $this->response->title('title')
                ->layout('layout')
                ->data(compact('data'))
                ->view('view')
                ->output();
    }
after code looks like:
    try {
            $attributes = $request->all();
            //do something
            return $this->response->message('')
                ->code(204)
                ->status('success')
                ->url('url'. $data->id)
                ->redirect();
        } catch (Exception $e) {
            return $this->response->message($e->getMessage())
                ->code(400)
                ->status('error')
                ->url('nothing Wrong')
                ->redirect()
        }

이것은 나를 위해 일했다


1

나는 그런 식으로 그것을 해결 한 것과 같은 문제가 있었다 : 내 아약스 :

event.preventDefault();
$.ajax('file.php', {
method: 'POST',
dataType: 'json',
contentType: 'application/json',
data: JSON.stringify({tab}), 
success: function(php_response){
            if (php_response == 'item') 
                {
                    console.log('it works');
                }
            }
        })

확인. 문제는 json이 아니라 PHP 응답에만 있습니다. 전에 : 내 PHP 응답은 다음과 같습니다

echo 'item';

지금:

$variable = 'item';
 echo json.encode($variable);

이제 내 성공이 작동합니다. 추신. 뭔가 잘못 되었다면 죄송하지만이 포럼에 대한 첫 번째 의견입니다 :)


0

제 경우에는 오류가 서버 측에 있었고 그 이유로 HTML을 반환했습니다.

wp_nonce_field(basename(__FILE__), "mu-meta-box-nonce");

0

이 방법으로 '오류'콜백 ( '성공'과 동일)을 추가하십시오.

$.ajax({
   type: 'POST',
   url: 'submit1.php',
   data: $("#regist").serialize(),
   dataType: 'json',
   success: function() {
      $("#loading").append("<h2>you are here</h2>");
   },
   error: function(jqXhr, textStatus, errorMessage){
      console.log("Error: ", errorMessage);
   }
});

그래서 제 경우에는 콘솔에서 보았습니다.

Error:  SyntaxError: Unexpected end of JSON input
  at parse (<anonymous>), ..., etc.

0

성공 및 오류 콜백을 모두 선언해야합니다. 첨가

error: function(err) {...} 

문제를 해결해야한다


-4

성공 콜백은 두 개의 인수를 :

success: function (data, textStatus) { }

또한 submit1.php적절한 컨텐츠 유형 헤더를 설정 했는지 확인하십시오 .application/json


답장을 보내 주셔서 감사합니다. 나는 jquery ajax documentaion에서 이것에 대해 읽었지만 그것이 작동하도록하기 위해 다음 단계가 무엇인지 알아낼 수는 없다. 또한 내 PHP 파일에 특정 코드가 있어야한다는 것을 의미합니까 ?? 고마워
codingbbq

7
success두 가지 주장 을 취하는 사실은 그 질문과 전혀 관련이없는 것 같습니다. 선언에 허용되는 수에 관계없이 모든 양의 매개 변수를 Javascript 함수에 전달할 수 있으므로 이러한 문제의 원인은 아니며 , 성공한 콜백에 값이 data없거나 textStatus사용 되지 않으므로 함수에서 그것들을 전혀 선언 할 이유가 없습니다.
David Hedlund

또한 JSON 데이터에는 올바른 콘텐츠 유형 헤더가 없어도되며 JSON 형식이어야합니다.
Tatu Ulmanen
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.