Sự kiện thành công Ajax không hoạt động


193

Tôi có một mẫu đăng ký và đang sử dụng $.ajaxđể gửi nó.

Đây là yêu cầu AJAX của tôi:

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

Trong tệp submit1.php của tôi, tôi kiểm tra sự tồn tại của địa chỉ emailtên người dùng trong cơ sở dữ liệu. Tôi muốn hiển thị một thông báo lỗi nếu những giá trị đó tồn tại mà không cần làm mới trang .

Làm cách nào tôi có thể thêm phần này vào cuộc gọi lại thành công của yêu cầu AJAX của tôi?


2
Bạn có chắc chắn gọi lại thành công được gọi?
rahul

Bạn cần đặt một câu hỏi mới cho vấn đề thứ hai của bạn.
Mike Lyons

Câu trả lời:


386

Kết quả có thể không ở định dạng JSON, vì vậy khi jQuery cố phân tích cú pháp như vậy, nó đã thất bại. Bạn có thể bắt lỗi vớierror: chức năng gọi lại.

Dường như bạn không cần JSON trong chức năng đó, vì vậy bạn cũng có thể đưa ra dataType: 'json'hàng.


14
tôi đã thay đổi dataType thành văn bản và làm cho nó hoạt động. như thế nàydataType:'text'
Magesh

+1 ngay cả của tôi, nhưng với mã không phải của tôi, tôi đã giải quyết bằng cách trả lại dữ liệu json từ máy chủ
albanx

4
Điều này cũng có thể xảy ra nếu dataType:không được chỉ định, nhưng url:kết thúc bằng .json.
davetapley

1
Ngoài ra, trong $.postbí danh cung cấp jsondưới dạng kiểu dữ liệu mà không có json thực tế đến từ máy chủ sẽ không kích hoạt successgọi lại
baldrs

Nếu bạn muốn thực hiện một yêu cầu json ajax, hãy chắc chắn rằng loại mime được đặt thành application / json. Điều đó đã cho tôi một số rắc rối.
Gellweiler

19

Mặc dù vấn đề đã được giải quyết nhưng tôi thêm điều này với hy vọng nó sẽ giúp được người khác.

Tôi đã phạm sai lầm khi cố gắng sử dụng một chức năng trực tiếp như thế này (thành công: OnSuccess (sản phẩmID)). Nhưng bạn phải vượt qua một chức năng ẩn danh trước:

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

Nếu bạn không sử dụng chức năng ẩn danh làm trình bao bọc thì OnSuccess được gọi ngay cả khi dịch vụ web trả về một ngoại lệ.


5
điều này không có gì để làm với ajax, cũng không phải jquery, cũng không phải xử lý. Chúng tôi cũng có thể có một bình luận nhắc nhở rằng "toàn bộ mã sẽ được gói trong một thẻ script". Giải thích là sai: bạn không phải bọc bất cứ thứ gì trong các hàm ẩn danh, một hàm được đặt tên sẽ làm, miễn là bạn vượt qua nó thay vì gọi nó. Hơn nữa, nó là sai lệch: OnSuccess được gọi trước khi yêu cầu thậm chí được gửi, vì vậy sẽ không có ý nghĩa gì khi liên hệ nó với dịch vụ web trả lại bất cứ điều gì.
fdreger

Câu trả lời này đã giúp tôi, nhưng tôi không upvote, bạn nên cập nhật câu trả lời của bạn theo nhận xét @fdreger.
Ozair Kafray 10/03/2015

15

Tôi đã thử xóa hàng dataType và nó không hoạt động với tôi. Tôi đã khắc phục vấn đề bằng cách sử dụng "hoàn thành" thay vì "thành công" như cuộc gọi lại. Cuộc gọi lại thành công vẫn thất bại trong IE, nhưng vì tập lệnh của tôi chạy và hoàn thành dù sao đó là tất cả những gì tôi quan tâm.

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

trong jQuery 1.5 bạn cũng có thể làm như thế này.

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

9
Chỉ cần một lưu ý cho điều này. completesẽ luôn được gọi bất kể cuộc gọi ajax có thành công hay không trong khi successchỉ được gọi nếu máy chủ web phản hồi với 200 OKtiêu đề HTTP (mọi thứ đều ổn).
katalin_2003

10

Hãy chắc chắn rằng bạn không in (echo hoặc in) bất kỳ văn bản / dữ liệu nào trước khi tạo dữ liệu được tạo thành JSON trong tệp PHP của bạn. Điều đó có thể giải thích rằng bạn nhận được 200 đô la - nhưng sự kiện thành công của bạn vẫn thất bại trong javascript của bạn. Bạn có thể xác minh những gì tập lệnh của bạn nhận được bằng cách kiểm tra phần "Mạng - Trả lời" trong fireorms cho POST submit1.php.


Điều này thực sự giúp tôi ra ngoài. Tôi biết đó là một câu trả lời cũ nhưng nó thực sự là vấn đề tôi gặp phải. Sử dụng echo hoặc print_r trong quá trình gỡ lỗi và phát hiện ra rằng những thứ đó thực sự gây ra lỗi ... :) Cảm ơn!
lennyklb

6 năm sau và vẫn giúp mọi người với câu trả lời này! Tôi sẽ không biết nơi nào để tìm khác.
Tania Rascia

5

Đặt một alert()trong của bạnsuccess cuộc gọi lại để đảm bảo rằng nó được gọi ở tất cả.

Nếu không, điều đó chỉ đơn giản là vì yêu cầu hoàn toàn không thành công, mặc dù bạn có thể tấn công máy chủ. Nguyên nhân hợp lý có thể là hết thời gian hoặc một cái gì đó trong mã php của bạn ném ra một ngoại lệ.

Cài đặt addon firebird cho firefox, nếu bạn chưa có và kiểm tra cuộc gọi lại AJAX. Bạn sẽ có thể xem phản hồi và liệu nó có nhận được phản hồi thành công (200 OK) hay không. Bạn cũng có thể đặt một cái khác alert()trong cuộc complete gọi lại, chắc chắn sẽ được gọi.


Cảm ơn vì đã trả lời. Đã thử cảnh báo trong sự kiện thành công nhưng nó không hoạt động. Tôi có addon firebird cho firefox và nó nhận được phản hồi thành công (200 OK) vì vậy không có vấn đề gì ở đó .. Tôi có một hàm die được gọi trong tệp php của tôi cho bất kỳ lỗi nào và khi tôi kiểm tra nó trong fireorms, nó hiển thị phản hồi đúng. bạn có ý gì khi nói "Bạn cũng có thể đặt một cảnh báo khác () trong cuộc gọi lại hoàn toàn, điều này chắc chắn sẽ được gọi." ?? Cảm ơn rất nhiều vì đã trả lời nhanh chóng
mã hóabbq

2
nếu bạn không thấy cảnh báo trong successđó, thì đó không phải là một thành công. vì phản hồi là 200 OK, câu trả lời của Tatu có vẻ hợp lý, nhưng để khắc phục sự cố, bạn có thể sử dụng một sự kiện khác, được gọi completeluôn luôn được gọi, bất kể yêu cầu có thành công hay không ( successchỉ xảy ra nếu yêu cầu thành công). complete: function (xhr, status) { alert('complete: '+status); }
David Hedlund

3

Tôi đã có vấn đề tương tự. nó xảy ra bởi vì loại dữ liệu javascriptmong đợi jsontrong việc trả lại dữ liệu. nhưng nếu bạn sử dụng echo hoặc in trong php của bạn thì tình huống này xảy ra. nếu bạn sử dụng echochức năng phpđể trả về dữ liệu, chỉ cần loại bỏ hoạt dataType : "json"động khá tốt.


2

Tôi đã trả lại JSON hợp lệ, nhận được phản hồi 200 trong cuộc gọi lại "hoàn thành" của tôi và có thể thấy nó trong bảng điều khiển mạng chrome ... NHƯNG tôi đã không chỉ định

dataType: "json"

một khi tôi đã làm, không giống như "câu trả lời được chấp nhận", điều đó thực sự đã khắc phục vấn đề.


1

Tôi đang sử dụng XML để mang kết quả trở lại từ php trên máy chủ đến trang web và tôi cũng có hành vi tương tự.

Trong trường hợp của tôi, lý do là, thẻ đóng không khớp với thẻ mở.

<?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

Tôi gặp vấn đề này khi sử dụng chức năng ajax để khôi phục mật khẩu người dùng từ Magento. Sự kiện thành công không bị sa thải, sau đó tôi nhận ra có hai lỗi:

  1. Kết quả không được trả về ở định dạng JSON
  2. Tôi đã cố gắng chuyển đổi một mảng thành định dạng JSON, nhưng mảng này có các ký tự không phải là utf

Vì vậy, mỗi lần tôi cố gắng sử dụng json_eoncde () để mã hóa mảng trả về, hàm này không hoạt động vì một trong các chỉ mục của nó có các ký tự không phải là utf, hầu hết đều nhấn mạnh vào các từ tiếng Bồ Đào Nha của Brazil.


1

Tôi đã cố gắng trả về chuỗi từ bộ điều khiển nhưng tại sao điều khiển quay lại khối lỗi không thành công của 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

Tôi gặp phải vấn đề tương tự khi truy vấn bộ điều khiển không trả về phản hồi thành công, khi sửa đổi bộ điều khiển của tôi để trả về vấn đề thông báo thành công đã được giải quyết. lưu ý sử dụng khung Lavalite. trước:

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()
        }

cái này làm việc cho tôi


1

Tôi đã có cùng một vấn đề tôi đã giải quyết nó theo cách đó: My 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');
                }
            }
        })

Đồng ý. Vấn đề không phải là với json mà chỉ là phản hồi của php. Trước đây: phản hồi php của tôi là:

echo 'item';

Hiện nay:

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

Bây giờ thành công của tôi làm việc. Tái bút Xin lỗi nếu có gì đó không đúng nhưng đó là nhận xét đầu tiên của tôi trên diễn đàn này :)


0

trong trường hợp của tôi, lỗi là do phía máy chủ và vì lý do đó, nó đã trả về một html

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

0

Thêm cuộc gọi lại 'lỗi' (giống như 'thành công') theo cách này:

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

Vì vậy, trong trường hợp của tôi, tôi đã thấy trong giao diện điều khiển:

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

0

Bạn phải khai báo cả cuộc gọi lại thành công và lỗi. Thêm

error: function(err) {...} 

nên khắc phục sự cố


-4

Cuộc gọi lại thành công có hai đối số:

success: function (data, textStatus) { }

Đồng thời đảm bảo rằng submit1.phpbộ tiêu đề loại nội dung phù hợp:application/json


Cảm ơn vì đã trả lời. Tôi đã đọc về điều này trên jquery ajax documentaion nhưng tôi không thể biết bước tiếp theo của tôi là gì để nó hoạt động ... sẽ đánh giá cao nếu bạn có thể chỉ cho tôi đi đúng hướng. Cũng có nghĩa là tôi nên có một số mã cụ thể trong tệp php của mình ?? cảm ơn rất nhiều
mã hóabbq

7
thực tế successcó hai lập luận dường như hoàn toàn không liên quan đến câu hỏi. Bạn có thể chuyển bất kỳ số lượng tham số nào cho hàm javascript, bất kể số lượng nó chấp nhận trong khai báo của nó là bao nhiêu, do đó chắc chắn không phải là nguyên nhân của các vấn đề này và vì không có giá trị nào datahoặc textStatusđang được sử dụng trong cuộc gọi lại thành công, dường như không có lý do chính đáng để tuyên bố chúng trong chức năng cả.
David Hedlund

Và dữ liệu JSON không nhất thiết phải có tiêu đề kiểu nội dung chính xác, nó chỉ phải ở định dạng JSON.
Tatu Ulmanen
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.