Успешное событие 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
Вы уверены, что обратный вызов был вызван?
Рахул

Вам нужно задать новый вопрос для вашей второй проблемы.
Майк Лайонс

Ответы:


390

Результат, вероятно, не в формате JSON, поэтому, когда jQuery пытается проанализировать его как таковой, происходит сбой. Вы можете отловить ошибку с помощью error:функции обратного вызова.

В любом случае, вам, похоже, не нужен JSON в этой функции, поэтому вы также можете убрать dataType: 'json'строку.


14
я изменил dataType на текст и получил его работать. как этоdataType:'text'
Magesh

+1 даже мой, но для кода, который не был моим, я решил вернуть данные json с сервера
albanx

4
Это также может произойти, если a dataType:не указано, но url:заканчивается на .json.
davetapley

1
Кроме того, при $.postпсевдониме, поставляемом в jsonкачестве типа данных без фактического json, поступающего с сервера, не запускается successобратный вызов
baldrs

Если вы хотите сделать ajax-запрос json, убедитесь, что для него установлен тип mime application / json. Это доставило мне некоторые неприятности.
Геллвайлер

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.
Озаир Кафрай

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 OKHTTP-заголовком (все в порядке).
katalin_2003

10

Убедитесь, что вы не печатаете (выводите или выводите) какой-либо текст / данные, прежде чем генерировать данные в формате JSON в файле PHP. Это может объяснить, что вы получили -sucessfull 200 OK-, но ваше событие sucess все равно не срабатывает в вашем javascript. Вы можете проверить, что получает ваш скрипт, проверив раздел «Сеть - Ответ» в firebug для POST submit1.php.


Это действительно помогло мне. Я знаю, что это старый ответ, но это была именно та проблема, с которой я столкнулся. Использование echo или print_r во время отладки и выяснение того, что они действительно вызывают ошибку ... :) Спасибо!
lennyklb

6 лет спустя и до сих пор помогаю людям с этим ответом! Я не знал бы, где искать иначе.
Таня Раскиа

5

Вставьте alert()ваш successобратный вызов, чтобы убедиться, что он вызывается вообще.

Если это не так, то это просто потому, что запрос вообще не был успешным, даже если вам удастся попасть на сервер. Разумные причины могут быть в том, что истекло время ожидания, или что-то в вашем php-коде вызывает исключение.

Установите дополнение Firebug для Firefox, если вы еще этого не сделали, и проверьте обратный вызов AJAX. Вы сможете увидеть ответ и узнать, получил ли он успешный ответ (200 OK). Вы также можете поместить другой alert()в complete обратный вызов, который обязательно должен быть вызван.


Спасибо за ваш ответ. Попытка оповещения в случае успеха, но это не сработало. У меня есть аддон firebug для firefox, и он получает успешный ответ (200 OK), поэтому никаких проблем нет .. У меня есть функция die, вызываемая в моем php-файле для любых ошибок, и когда я проверяю ее в firebug, она показывает правильный ответ. что вы подразумеваете под "Вы можете также добавить еще один alert () в полный обратный вызов, который обязательно должен быть вызван". ?? Большое спасибо за быстрый ответ
codingbbq

2
если вы не видите предупреждение в своем success, то это не успех. Так как ответ 200 OK, ответ Tatu кажется разумным, но для дальнейшего устранения неполадок вы можете использовать другое событие, completeкоторое вызывается всегда, независимо от того, успешен ли запрос ( successтолько если запрос успешен). complete: function (xhr, status) { alert('complete: '+status); }
Дэвид Хедлунд

3

У меня была такая же проблема. это происходит потому, что javascriptожидайте jsonтип данных в возвращаемых данных. но если вы используете echo или print в своем 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 () для кодирования возвращаемого массива, функция не работала, потому что один из ее индексов содержал не-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 Framework. перед:

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

Добавьте обратный вызов «error» (так же, как «success») следующим образом:

$.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, но я не могу понять, каким должен быть мой следующий шаг, чтобы заставить его работать ... был бы признателен, если бы вы указали мне правильное направление. Также это означает, что у меня должен быть некоторый определенный код в моем файле php ??
Большое

7
факт, который successпринимает два аргумента, кажется совершенно не относящимся к вопросу. Вы можете передать любое количество параметров в функцию javascript, независимо от того, сколько она принимает в своем объявлении, так что это определенно не является причиной этих проблем, и, поскольку ни одно из значений dataили textStatusне используется в обратном вызове успеха, кажется, что не будет никакой веской причины объявлять их в функции вообще.
Дэвид Хедлунд

И данные JSON не обязательно должны иметь правильный заголовок типа контента, они просто должны быть в формате JSON.
Тату Ульманен
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.