Успешное событие Ajax не работает

166

У меня есть регистрационная форма, и я использую $.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
    Вы уверены, что обратный вызов был вызван?
  • 0
    Вам нужно задать новый вопрос для вашей второй проблемы.

15 ответов

339
Лучший ответ

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

Кажется, вам не нужна JSON в этой функции, поэтому вы также можете вывести строку dataType: 'json'.

  • 9
    я изменил dataType на текст и получил его работать. нравится этот dataType:'text'
  • 0
    +1 даже мой, но для кода, который не был моим, я решил, возвращая данные JSON с сервера
Показать ещё 7 комментариев
15

Хотя проблема уже решена, я добавляю это в надежде, что она поможет другим.

Я сделал ошибку, попытался использовать функцию прямо так (успех: 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 вызывается, даже если веб-служба возвращает исключение.

  • 4
    это не имеет ничего общего ни с ajax, ни с jquery, ни с обработчиками. Мы могли бы также иметь комментарий, напоминающий, что «весь код должен быть обернут в тег скрипта». Объяснение ложное: вам не нужно ничего оборачивать в анонимные функции, это сделает именованная функция, если вы передадите ее вместо вызова. Более того, это вводит в заблуждение: OnSuccess вызывается еще до того, как запрос отправлен, поэтому нет смысла связывать его с веб-сервисом, возвращающим что-либо.
  • 0
    Этот ответ помог мне, но я не высказался, вы должны обновить свой ответ в соответствии с комментарием @fdreger.
14

Я попытался удалить строку dataType, и это не сработало для меня. Я обошел проблему, используя "полный", а не "успех" в качестве обратного вызова. Обратный вызов успеха все еще терпит неудачу в IE, но поскольку мой script запускает и завершает все, что мне все равно.

$.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 ... 
    }
});
  • 8
    Просто примечание к этому. complete всегда вызывается независимо от того, был ли успешным вызов ajax или нет, в то время как success вызывается только в том случае, если веб-сервер отвечает HTTP-заголовком 200 OK (все в порядке).
10

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

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

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

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

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

  • 0
    Спасибо за ваш ответ. Попытка оповещения в случае успеха, но это не сработало. У меня есть аддон firebug для firefox, и он получает успешный ответ (200 OK), поэтому никаких проблем нет .. У меня есть функция die, вызываемая в моем php-файле для любых ошибок, и когда я проверяю ее в firebug, она показывает правильный ответ. что вы подразумеваете под «Вы можете также добавить еще один alert () в полный обратный вызов, который обязательно должен быть вызван». ?? Большое спасибо за быстрый ответ
  • 2
    если вы не видите предупреждение в своем success , то это не успех. так как ответ 200 OK, ответ Tatu кажется разумным, но для дальнейшего устранения неполадок вы можете использовать другое событие, называемое complete которое всегда вызывается независимо от того, успешен ли запрос ( success происходит только в том случае, если запрос успешен). complete: function (xhr, status) { alert('complete: '+status); }
3

У меня была такая же проблема. это происходит потому, что javascript ожидает json тип данных при возврате данных. но если вы используете эхо или печать в своем php, эта ситуация возникает. если вы используете функцию echo в php для возврата данных, просто удалите dataType : "json", работая довольно хорошо.

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

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

У меня возникла проблема с использованием функции ajax для восстановления пароля пользователя от Magento. Событие успеха не было уволено, тогда я понял, что есть две ошибки:

  • Результат не возвращался в формате JSON
  • Я пытался преобразовать массив в формат JSON, но этот массив имел не-utf-символы

Поэтому каждый раз, когда я пытался использовать json_eoncde() для кодирования возвращаемого массива, функция не работала, потому что один из его индексов имел не-utf-символы, большинство из которых подчеркивали бразильские португальские слова.

1

Я возвращал действительный JSON, получив ответ 200 в моем "полном" обратном вызове и мог видеть его в хромной сетевой консоли... НО я не указал

dataType: "json"

как только я это сделал, в отличие от "принятого ответа", это фактически устранило проблему.

0

У меня была та же проблема, я решил ее таким образом: Мой 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

Добавьте обратный вызов "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

в моем случае ошибка была в стороне сервера, и по этой причине он возвращал html

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

Я использую 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>";
?>
  • 0
    Ваш код слишком уродлив, зачем здесь использовать теги php?
-5

успешный обратный вызов принимает два аргумента:

success: function (data, textStatus) { }

Также убедитесь, что submit1.php устанавливает правильный заголовок типа содержимого: application/json

  • 0
    Спасибо за ваш ответ. Я читал об этом в документации jquery ajax, но я не могу понять, каким должен быть мой следующий шаг, чтобы заставить его работать ... был бы признателен, если бы вы указали мне правильное направление. Также это означает, что у меня должен быть некоторый определенный код в моем файле php ?? большое спасибо
  • 7
    тот факт, что success требует двух аргументов, кажется совершенно неуместным для вопроса. Вы можете передать любое количество параметров в функцию javascript, независимо от того, сколько она принимает в своем объявлении, так что это определенно не является причиной этих проблем, и поскольку ни одно из значений data или textStatus не используется в textStatus success, существует Кажется, нет веской причины объявлять их в функции вообще.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню