Подія успіху 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
Ви впевнені, що викликається зворотний виклик?
rahul

Вам потрібно задати нове запитання щодо своєї другої проблеми.
Майк Ліонс

Відповіді:


390

Результат, ймовірно, не у форматі JSON, тому коли jQuery намагається проаналізувати його як такий, він не вдається. Ви можете зрозуміти помилку за допомогою error:функції зворотного дзвінка.

Вам, здається, не потрібен JSON у цій функції, так що ви також можете вийняти dataType: 'json'рядок.


14
я змінив тип даних в текст і змусив його працювати. ось такdataType:'text'
Магеш

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

4
Це також може статися, якщо dataType:не вказано значення, але воно url:закінчується .json.
davetapley

1
Також у $.postнаданні псевдоніму jsonяк тип даних без фактичного json, що надходить з сервера, не викликає successзворотного виклику
балд

Якщо ви хочете зробити запит на 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;
  }

Якщо ви не використовуєте анонімну функцію в якості обгортки, OnSuccess викликається, навіть якщо веб-сервіс повертає виняток.


5
це не має нічого спільного з аяксом, ані jquery, ані обробниками. Ми могли б також мати коментар, який нагадує, що "весь код повинен бути загорнутий у тег сценарію". Пояснення хибне: вам не потрібно нічого обгортати в анонімні функції, названа функція буде робити, доки ви передасте її замість того, щоб викликати її. Крім того, це вводить в оману: 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 OKHTTP-заголовку (все гаразд).
katalin_2003

10

Переконайтеся, що ви не друкуєте (повторюєте чи друкували) будь-який текст / дані до того, як генерувати свої форматовані JSON дані у вашому PHP-файлі. Це може пояснити, що ви отримуєте -надійні 200 ОК-, але ваш успіх у вашому JavaScript все ще не вдається. Ви можете перевірити, що отримує ваш скрипт, перевіривши розділ «Мережа - відповідь» у firebug для POST submit1.php.


Це мені справді допомогло. Я знаю, що це стара відповідь, але це була проблема, яку я мав. Використання echo або print_r під час налагодження та з'ясування того, що вони насправді викликають помилку ... :) Дякую!
lennyklb

Через 6 років і досі допомагаю людям з цією відповіддю! Я б не знав, де шукати інакше.
Tania Rascia

5

Покладіть alert()своєsuccess функції зворотного виклику , щоб переконатися , що вона викликається на всіх.

Якщо це не так, це просто тому, що запит взагалі не був успішним, навіть якщо вам вдалося потрапити на сервер. Причиною може бути те, що закінчується час очікування або щось із вашого PHP-коду викидає виняток.

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


Спасибі за Вашу відповідь. Спробував оповіщення у випадку успіху, але це не спрацювало. У мене є firebug addon для firefox, і він отримує успішну (200 ОК) відповідь, тому ніяких проблем немає .. У мене є функція die, що викликається у моєму файлі php щодо будь-яких помилок, і коли я перевіряю це у firebug, він показує належну відповідь. що ви маєте на увазі під "Ви також можете помістити ще одне попередження () у повний зворотний дзвінок, до якого обов'язково слід викликати" Дякую за швидку відповідь
codingbbq

2
якщо ви не бачите попередження у своєму success, то це не буде успіхом. оскільки відповідь 200 ОК, відповідь Тату видається розумним, але для подальшого усунення неполадок ви можете використовувати іншу подію, completeяка називається завжди, коли вона викликається, незалежно від того, успіх запиту чи ні ( successвідбувається лише у випадку успішного запиту). complete: function (xhr, status) { alert('complete: '+status); }
Девід Хедлунд

3

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


2

Я повертав дійсний JSON, отримуючи відповідь 200 у своєму "повному" зворотному дзвінку, і міг бачити це в хромованій мережевій консолі ... Але я не вказав

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. перед:

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

У мене була така ж проблема, що я вирішив її таким чином: 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');
                }
            }
        })

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

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

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