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.