Zdarzenie sukcesu Ajax nie działa


194

Mam formularz rejestracyjny i używam go, $.ajaxaby go przesłać.

To jest moja prośba 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;        
    });
});

W moim pliku Submit1.php sprawdzam, czy pola zawierają adres e-mail i nazwę użytkownika w bazie danych . Chcę wyświetlić komunikat o błędzie, jeśli te wartości istnieją bez odświeżenia strony .

Jak mogę dodać to do powodzenia wywołania zwrotnego mojego żądania AJAX?


2
Czy jesteś pewien, że wywołanie zwrotne powiodło się?
— rahul

Musisz zadać nowe pytanie dotyczące drugiego problemu.
— Mike Lyons,

Odpowiedzi:


388

Wynik prawdopodobnie nie jest w formacie JSON, więc gdy jQuery spróbuje go parsować jako taki, nie powiedzie się. Możesz złapać błąd dzięki error:funkcji zwrotnej.

Wydaje się, że i tak nie potrzebujesz JSON w tej funkcji, więc możesz także wyjąć dataType: 'json'wiersz.


14
zmieniłem dataType na tekst i uruchomiłem go. jak todataType:'text'
— Magesh

+1 nawet mój, ale na kodzie, który nie był mój, rozwiązałem, zwracając dane
— JSON

4
Może się to również zdarzyć, jeśli dataType:nie określono, ale url:kończy się na .json.
— davetapley

1
Również w przypadku $.postaliasu dostarczanego jsonjako typ danych bez rzeczywistego success
— pliku Json

Jeśli chcesz złożyć zapytanie Json ajax, upewnij się, że typ MIME jest ustawiony na application / Json. To sprawiło mi trochę problemów.
— Gellweiler,

19

Chociaż problem został już rozwiązany, dodaję to w nadziei, że pomoże innym.

Popełniłem błąd i próbowałem użyć funkcji bezpośrednio takiej jak ta (sukces: OnSuccess (productID)). Ale najpierw musisz przekazać anonimową funkcję:

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

Jeśli nie używasz funkcji anonimowej jako opakowania, wywoływany jest OnSuccess, nawet jeśli usługa internetowa zwraca wyjątek.


5
nie ma to nic wspólnego z ajaxem, ani jquery, ani programami obsługi. Równie dobrze moglibyśmy mieć komentarz przypominający, że „cały kod powinien być zawinięty w tag skryptu”. Wyjaśnienie jest fałszywe: nie musisz zawijać niczego w funkcje anonimowe, funkcja nazwana zrobi tak długo, jak ją przekażesz zamiast wywoływać. Co więcej, jest to mylące: OnSuccess jest wywoływany przed wysłaniem żądania, więc nie ma sensu odnosić go do usługi internetowej zwracającej cokolwiek.
— fdreger

Ta odpowiedź pomogła mi, ale nie głosowałem za nią, powinieneś zaktualizować swoją odpowiedź zgodnie z komentarzem @fdreger.
— Ozair Kafray

15

Próbowałem usunąć wiersz dataType i nie działało to dla mnie. Rozwiązałem ten problem, używając „zakończenia” zamiast „sukcesu” jako oddzwaniania. Wywołanie zwrotne sukcesu nadal kończy się niepowodzeniem w IE, ale ponieważ mój skrypt działa i kończy się, to wszystko, co mnie obchodzi.

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

W jQuery 1.5 możesz to zrobić w ten sposób.

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

9
Tylko uwaga na ten temat. completebędzie zawsze wywoływany bez względu na to, czy wywołanie ajax zakończyło się powodzeniem, czy nie, a successwywoływany jest tylko wtedy, gdy serwer WWW odpowiada 200 OKnagłówkiem HTTP (wszystko jest w porządku).
— katalin_2003

10

Upewnij się, że nie drukujesz (echo ani nie drukujesz) żadnego tekstu / danych przed wygenerowaniem danych sformatowanych w JSON w pliku PHP. To może wyjaśniać, że otrzymujesz -udane 200 OK, ale twoje sukcesy nadal zawodzą w javascript. Możesz sprawdzić, co otrzymuje skrypt, zaznaczając sekcję „Sieć - odpowiedź” w firebug dla POST subm1.php.


To mi naprawdę pomogło. Wiem, że to stara odpowiedź, ale to był właśnie problem, który miałem. Używanie echa lub print_r podczas debugowania i stwierdzanie, że to one faktycznie powodują błąd ... :) Dzięki!
— lennyklb

6 lat później i nadal pomagam ludziom z tą odpowiedzią! Nie wiedziałbym gdzie szukać inaczej.
— Tania Rascia,

5

Umieść alert() w swoimsuccess zwrotnego aby upewnić się, że miano w ogóle.

Jeśli tak nie jest, to po prostu dlatego, że żądanie w ogóle się nie powiodło, nawet jeśli udało ci się trafić na serwer. Uzasadnionymi przyczynami może być upływ czasu lub coś w twoim kodzie php zgłasza wyjątek.

Zainstaluj dodatek firebug dla Firefoksa, jeśli jeszcze tego nie zrobiłeś i sprawdź wywołanie zwrotne AJAX. Będziesz mógł zobaczyć odpowiedź i informację, czy otrzyma odpowiedź (200 OK). Możesz także umieścić inny alert()w complete wywołaniu zwrotnym, który zdecydowanie należy wywołać.


Dzięki za odpowiedź. Wypróbowałem alert w przypadku powodzenia, ale to nie zadziałało. Mam dodatek Firebug dla Firefoksa i otrzymuje on udaną odpowiedź (200 OK), więc nie ma problemów. Mam funkcję die wywołaną w moim pliku php dla jakichkolwiek błędów, a kiedy sprawdzam to w Firebug, pokazuje prawidłową odpowiedź. co masz na myśli przez „Możesz także umieścić kolejny alert () w pełnym wywołaniu zwrotnym, które zdecydowanie należy wywołać.” ?? Bardzo dziękuję za szybką odpowiedź
— codingbbq

2
jeśli nie widzisz alertu success, to nie jest to sukces. ponieważ odpowiedź wynosi 200 OK, odpowiedź Tatu wydaje się rozsądna, ale w celu dalszego rozwiązywania problemów można użyć innego zdarzenia, wywoływanego, completektóre jest zawsze wywoływane, niezależnie od tego, czy żądanie zakończy się powodzeniem ( successtylko wtedy, gdy żądanie się powiedzie). complete: function (xhr, status) { alert('complete: '+status); }
— David Hedlund,

3

Miałem ten sam problem. dzieje się tak, ponieważ javascriptoczekuj jsontypu danych w zwracanych danych. ale jeśli używasz echa lub drukowania w swoim php, taka sytuacja ma miejsce. jeśli używasz echofunkcji in phpdo zwracania danych, po prostu usuń dataType : "json"działający całkiem dobrze.


2

Zwracałem prawidłowy JSON, otrzymałem odpowiedź 200 w moim „pełnym” wywołaniu zwrotnym i mogłem zobaczyć to w chromowanej konsoli sieci ... ALE nie określiłem

dataType: "json"

kiedyś to zrobiłem, w przeciwieństwie do „zaakceptowanej odpowiedzi”, która faktycznie rozwiązała problem.


1

Używam XML, aby przenieść wynik z php na serwerze na stronę internetową i miałem takie samo zachowanie.

W moim przypadku przyczyną było to, że tag zamykający nie pasował do tagu otwierającego.

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

Miałem ten problem przy użyciu funkcji ajax do odzyskania hasła użytkownika z Magento. Zdarzenie sukcesu nie zostało uruchomione, a potem zdałem sobie sprawę, że wystąpiły dwa błędy:

  1. Wynik nie został zwrócony w formacie JSON
  2. Próbowałem przekonwertować tablicę na format JSON, ale ta tablica miała znaki inne niż utf

Dlatego za każdym razem, gdy próbowałem użyć json_eoncde () do kodowania zwracanej tablicy, funkcja nie działała, ponieważ jeden z jej indeksów zawierał znaki inne niż utf, z których większość zaakcentowała brazylijskie portugalskie słowa.


1

Próbowałem zwrócić ciąg z kontrolera, ale dlaczego kontrola powraca do bloku błędów nie powiodła się w 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

Napotkałem ten sam problem podczas odpytywania kontrolera, który nie zwraca odpowiedzi powodzenia, gdy zmodyfikowałem mój kontroler, aby zwrócił komunikat o powodzeniu problemu. Uwaga przy użyciu ramy Lavalite. przed:

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

to zadziałało dla mnie


1

Miałem ten sam problem, który rozwiązałem w ten sposób: Mój 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');
                }
            }
        })

Dobrze. Problem nie dotyczy json, ale tylko odpowiedzi php. Przed: moja odpowiedź php brzmiała:

echo 'item';

Teraz:

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

Teraz mój sukces działa. PS. Przepraszam, jeśli coś jest nie tak, ale to mój pierwszy komentarz na tym forum :)


0

w moim przypadku błąd był po stronie serwera iz tego powodu zwracał HTML

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

0

Dodaj wywołanie zwrotne „błąd” (podobnie jak „sukces”) w ten sposób:

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

Tak więc w moim przypadku widziałem w konsoli:

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

0

Musisz zadeklarować zarówno połączenie zwrotne powodzenia, jak i błędu. Dodawanie

error: function(err) {...} 

powinien rozwiązać problem


-4

Sukces zwrotna przyjmuje dwa argumenty:

success: function (data, textStatus) { }

Upewnij się również, że submit1.phpustawia odpowiedni nagłówek typu zawartości:application/json


Dzięki za odpowiedź. Przeczytałem o tym na dokumentacji jquery ajax, ale nie mogę zrozumieć, co powinienem zrobić, aby to działało ... doceniłbym, gdybyś mógł wskazać mi właściwy kierunek. Czy to również oznacza, że ​​powinienem mieć określony kod w pliku php? wielkie dzięki
— codingbbq

7
fakt, że successprzyjmuje się dwa argumenty, wydaje się zupełnie nieistotny dla pytania. Możesz przekazać dowolną liczbę parametrów do funkcji javascript, niezależnie od tego, ile akceptuje w deklaracji, więc zdecydowanie nie jest to przyczyną tych problemów, a ponieważ żadna z wartości datalub textStatusnie jest używana w wywołaniu zwrotnym sukcesu, wydaje się, że nie ma żadnego powodu, aby w ogóle deklarować je w funkcji.
— David Hedlund,

A dane JSON nie muszą mieć poprawnego nagłówka typu treści, muszą być tylko w formacie JSON.
— Tatu Ulmanen
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.