เหตุการณ์ความสำเร็จของ 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
คุณแน่ใจหรือไม่ว่าการเรียกกลับสำเร็จนั้นถูกเรียกใช้?
ราหู

คุณต้องถามคำถามใหม่สำหรับปัญหาที่สองของคุณ
Mike Lyons

คำตอบ:


390

ผลลัพธ์อาจไม่อยู่ในรูปแบบ JSON ดังนั้นเมื่อ jQuery พยายามแยกวิเคราะห์เช่นนั้นจะล้มเหลว คุณสามารถตรวจจับข้อผิดพลาดด้วยerror:ฟังก์ชั่นการโทรกลับ

ดูเหมือนว่าคุณไม่จำเป็นต้องใช้ JSON ในฟังก์ชั่นนี้เลยดังนั้นคุณสามารถนำdataType: 'json'แถวออกมาได้


14
ฉันเปลี่ยน dataType เป็นข้อความและทำให้มันใช้งานได้ แบบนี้dataType:'text'
Magesh

1 แม้ฉัน แต่รหัสที่ไม่ได้ฉันฉันแก้ไขด้วยการกลับ JSON ข้อมูลจากเซิร์ฟเวอร์
albanx

4
นอกจากนี้ยังสามารถเกิดขึ้นได้หากdataType:ไม่ได้ระบุ แต่ปลายในurl: .json
davetapley

1
นอกจากนี้ใน$.postนามแฝงที่จัดหาjsonเป็นชนิดข้อมูลโดยไม่มี json จริงที่มาจากเซิร์ฟเวอร์ไม่ทำให้เกิดการเรียกsuccessกลับ
baldrs

หากคุณต้องการทำคำขอ json ajax ต้องแน่ใจว่าประเภท mime นั้นถูกตั้งค่าเป็น 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;
  }

ถ้าคุณไม่ใช้ฟังก์ชันที่ไม่ระบุชื่อเนื่องจาก wrapper OnSuccess จะถูกเรียกใช้แม้ว่าเว็บเซอร์จะส่งคืนข้อยกเว้น


5
สิ่งนี้ไม่เกี่ยวข้องกับ ajax หรือ jquery หรือ handler เราอาจมีความคิดเห็นที่เตือนว่า "โค้ดทั้งหมดจะถูกห่อในแท็กสคริปต์" คำอธิบายเป็นเท็จ: คุณไม่จำเป็นต้องห่ออะไรในฟังก์ชั่นที่ไม่ระบุชื่อฟังก์ชั่นที่มีชื่อจะทำตราบใดที่คุณผ่านมันแทนที่จะเรียกมัน ยิ่งไปกว่านั้นมันทำให้เข้าใจผิด: 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
เพียงแค่ทราบถึงเรื่องนี้ completeจะถูกเรียกใช้เสมอโดยไม่คำนึงว่าการโทร ajax สำเร็จหรือไม่ในขณะที่successถูกเรียกเท่านั้นถ้าเว็บเซิร์ฟเวอร์ตอบกลับด้วย200 OKส่วนหัว HTTP (ทุกอย่างก็โอเค)
katalin_2003

10

ตรวจสอบให้แน่ใจว่าคุณไม่ได้พิมพ์ (echo หรือ print) ข้อความ / ข้อมูลใด ๆ ก่อนที่จะสร้างข้อมูลที่จัดรูปแบบ JSON ในไฟล์ PHP ของคุณ นั่นอาจอธิบายได้ว่าคุณได้รับ -sucessfull 200 OK- แต่เหตุการณ์ที่ประสบความสำเร็จของคุณยังคงล้มเหลวในจาวาสคริปต์ของคุณ คุณสามารถตรวจสอบสิ่งที่สคริปต์ของคุณได้รับโดยการตรวจสอบส่วน "เครือข่าย - คำตอบ" ใน firebug สำหรับ POST submit1.php


สิ่งนี้ช่วยฉันได้จริงๆ ฉันรู้ว่ามันเป็นคำตอบเก่า แต่ก็เป็นปัญหาที่ฉันมี การใช้ echo's หรือ print_r ระหว่างการดีบักและพบว่าสิ่งเหล่านั้นทำให้เกิดข้อผิดพลาดจริง ๆ ... :) ขอบคุณ!
lennyklb

6 ปีต่อมาและยังช่วยเหลือผู้คนด้วยคำตอบนี้! ฉันไม่รู้จักที่จะมองอย่างอื่น
Tania Rascia

5

ใส่alert()ในการsuccessโทรกลับของคุณเพื่อให้แน่ใจว่ามันถูกเรียกเลย

หากไม่ใช่นั่นเป็นเพราะคำขอไม่สำเร็จเลยแม้ว่าคุณจะจัดการกับเซิร์ฟเวอร์แล้วก็ตาม สาเหตุที่สมเหตุสมผลอาจเป็นเพราะการหมดเวลาหมดอายุหรือบางสิ่งในรหัส php ของคุณเกิดข้อผิดพลาด

ติดตั้ง firebug addon สำหรับ firefox หากคุณยังไม่ได้ทำการตรวจสอบ AJAX callback คุณจะสามารถเห็นการตอบสนองและจะรับการตอบสนองที่ประสบความสำเร็จหรือไม่ (200 ตกลง) นอกจากนี้คุณยังสามารถใส่หมายเลขอื่นalert()ในการcomplete โทรกลับซึ่งควรเรียกใช้อย่างแน่นอน


ขอบคุณสำหรับการตอบกลับของคุณ. พยายามแจ้งเตือนในเหตุการณ์ที่ประสบความสำเร็จ แต่มันไม่ทำงาน ฉันมี firebug addon สำหรับ firefox และได้รับการตอบสนองที่ประสบความสำเร็จ (200 OK) ดังนั้นจึงไม่มีปัญหาที่นั่น .. ฉันมีฟังก์ชั่นตายที่เรียกว่าในไฟล์ php ของฉันสำหรับข้อผิดพลาดใด ๆ และเมื่อฉันตรวจสอบใน firebug จะแสดงการตอบสนองที่เหมาะสม คุณหมายถึงอะไรโดย "คุณยังสามารถใส่การแจ้งเตือนอื่น () ในการติดต่อกลับที่สมบูรณ์ซึ่งควรเรียกใช้อย่างแน่นอน" ?? ขอบคุณมากสำหรับการตอบกลับอย่างรวดเร็ว
codingbbq

2
หากคุณไม่เห็นการแจ้งเตือนในของคุณแสดงsuccessว่าไม่สำเร็จ ตั้งแต่การตอบสนองคือ 200 ตกลงตอบ Tatu ดูเหมือนว่าเหมาะสม แต่สำหรับการแก้ไขปัญหาต่อไปคุณสามารถใช้เหตุการณ์อื่นที่เรียกว่าcompleteซึ่งถูกเรียกเสมอโดยไม่คำนึงถึงหรือไม่ว่าการร้องขอจะประสบความสำเร็จ ( successจะเกิดขึ้นถ้าขอเป็นที่ประสบความสำเร็จ) complete: function (xhr, status) { alert('complete: '+status); }
David Hedlund

3

ฉันมีปัญหาเดียวกัน มันเกิดขึ้นเพราะjavascriptคาดว่าjsonชนิดข้อมูลในการส่งคืนข้อมูล แต่ถ้าคุณใช้เสียงก้องหรือพิมพ์ใน php ของคุณสถานการณ์นี้เกิดขึ้น ถ้าคุณใช้echoฟังก์ชั่นในphpการส่งคืนข้อมูลเพียงแค่ลบdataType : "json"การทำงานที่ดี


2

ฉันส่งคืน JSON ที่ถูกต้องได้รับการตอบสนอง 200 ในการติดต่อกลับ "สมบูรณ์" ของฉันและสามารถเห็นได้ในคอนโซลเครือข่าย chrome ... แต่ฉันไม่ได้ระบุ

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

ฉันมีปัญหานี้โดยใช้ฟังก์ชั่น ajax เพื่อกู้คืนรหัสผ่านผู้ใช้จาก Magento เหตุการณ์ความสำเร็จไม่ได้ถูกไล่ออกจากนั้นฉันก็รู้ว่ามีข้อผิดพลาดสองประการ:

  1. ผลลัพธ์ไม่ถูกส่งคืนในรูปแบบ JSON
  2. ฉันพยายามแปลงอาร์เรย์เป็นรูปแบบ JSON แต่อาร์เรย์นี้มีอักขระที่ไม่ใช่ utf

ดังนั้นทุกครั้งที่ฉันพยายามใช้ json_eoncde () เพื่อเข้ารหัสอาร์เรย์ที่ส่งคืนฟังก์ชันจะไม่ทำงานเนื่องจากดัชนีตัวใดตัวหนึ่งมีอักขระที่ไม่ใช่ตัวอักษรส่วนใหญ่เป็นการเน้นเสียงด้วยคำบราซิลโปรตุเกส


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

ฉันมีปัญหาเดียวกันฉันแก้ไขมันด้วยวิธีนี้: ajax ของฉัน:

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);

ตอนนี้ความสำเร็จของฉันทำงาน PS ขออภัยหากมีสิ่งผิดปกติ แต่เป็นความคิดเห็นแรกของฉันในฟอรั่มนี้ :)


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.