Не удалось выполнить событие Ajax

У меня есть регистрационная форма, и я использую $.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?

Ответ 1

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

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

Ответ 2

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

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

Ответ 3

Я попытался удалить строку 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 ... 
    }
});

Ответ 4

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

Ответ 5

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

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

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

Ответ 6

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

Ответ 7

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

dataType: "json"

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

Ответ 8

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

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

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

Ответ 9

Я попытался вернуть строку из контроллера, но почему управление возвратом к блоку ошибок не в успехе 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);
    }
});

Ответ 10

Я столкнулся с той же проблемой при обращении к контроллеру, который не возвращает ответ об успешном завершении, когда был изменен мой контроллер для возврата сообщения об успешном завершении. обратите внимание, используя 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()
        }

это сработало для меня

Ответ 11

Я использую 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>";
?>

Ответ 12

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

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

Ответ 13

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

Ответ 14

У меня была та же проблема, я решил ее таким образом: Мой 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. Извините, если что-то не так, но это мой первый комментарий на этом форуме :)

Ответ 15

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

success: function (data, textStatus) { }

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