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.