Evento di successo Ajax non funzionante


194

Ho un modulo di registrazione e lo sto usando $.ajaxper inviarlo.

Questa è la mia richiesta 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;        
    });
});

Nel mio file submit1.php controllo l'esistenza di campi indirizzo e -mail e nome utente nel database. Vorrei visualizzare un messaggio di errore se quel valore esiste senza un aggiornamento della pagina .

Come posso aggiungere questo al callback di successo della mia richiesta AJAX?


2
Sei sicuro di aver richiamato il callback di successo?
rahul,

Devi fare una nuova domanda per il tuo secondo problema.
Mike Lyons,

Risposte:


390

Il risultato probabilmente non è in formato JSON, quindi quando jQuery tenta di analizzarlo come tale, fallisce. È possibile rilevare l'errore con la error:funzione di richiamata.

Non sembra che tu abbia bisogno di JSON in quella funzione, quindi puoi anche eliminare la dataType: 'json'riga.


14
ho cambiato il tipo di dati in testo e l'ho fatto funzionare. cosìdataType:'text'
Magesh

+1 anche il mio, ma su un codice che non era mio, ho risolto restituendo i dati json dal server
albanx,

4
Questo può accadere anche se a dataType:non è specificato, ma url:finisce .json.
davetapley,

1
Anche $.postalias che fornisce jsoncome tipo di dati senza l'effettivo json proveniente dal server non attiva la successrichiamata
baldrs

Se si desidera effettuare una richiesta Ajax json, assicurarsi che il tipo MIME sia impostato su application / json. Questo mi ha dato qualche problema.
Gellweiler,

19

Anche se il problema è già risolto, lo aggiungo nella speranza che possa aiutare gli altri.

Ho fatto l'errore e ho provato a usare una funzione direttamente come questa (esito positivo: OnSuccess (productID)). Ma devi prima passare una funzione anonima:

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

Se non si utilizza una funzione anonima come wrapper, viene chiamato OnSuccess anche se il servizio Web restituisce un'eccezione.


5
questo non ha nulla a che fare con Ajax, né jquery, né i gestori. Potremmo anche avere un commento che ricorda che "l'intero codice dovrebbe essere racchiuso in un tag di script". La spiegazione è falsa: non è necessario racchiudere nulla in funzioni anonime, una funzione denominata farà, a condizione che la si passi invece di chiamarla. Inoltre è fuorviante: OnSuccess viene chiamato prima ancora che la richiesta venga inviata, quindi non ha senso collegarla al servizio web restituendo qualcosa.
fdreger

Questa risposta mi ha aiutato, ma non ho votato, dovresti aggiornare la tua risposta in base al commento di @fdreger.
Ozair Kafray,

15

Ho provato a rimuovere la riga dataType e non ha funzionato per me. Ho risolto il problema usando "complete" anziché "success" come callback. Il callback di successo non riesce ancora in IE, ma dal momento che il mio script viene eseguito e completato, è tutto ciò che mi interessa.

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

in jQuery 1.5 puoi anche farlo in questo modo.

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

9
Solo una nota per questo. completeverrà sempre chiamato indipendentemente dal fatto che la chiamata ajax abbia avuto esito positivo o meno mentre successviene chiamata solo se il server Web risponde con 200 OKun'intestazione HTTP (tutto ok).
katalin_2003,

10

Assicurati di non stampare (eco o stampare) alcun testo / dati prima di generare i tuoi dati formattati JSON nel tuo file PHP. Ciò potrebbe spiegare che si ottiene un successo di 200 OK, ma il tuo evento di successo non riesce ancora nel tuo javascript. Puoi verificare cosa sta ricevendo il tuo script controllando la sezione "Rete - Risposta" in firebug per POST submit1.php.


Questo mi ha davvero aiutato. So che è una vecchia risposta, ma era esattamente il problema che avrei avuto. Usando echo o print_r durante il debug e scoprendo che quelli effettivamente causano il bug ... :) Grazie!
lennyklb,

6 anni dopo e continuo ad aiutare le persone con questa risposta! Non avrei saputo dove cercare altrimenti.
Tania Rascia,

5

Metti un alert()nel tuosuccess callback per assicurarsi che viene chiamato a tutti.

In caso contrario, è semplicemente perché la richiesta non ha avuto esito positivo, anche se riesci a raggiungere il server. Cause ragionevoli potrebbero essere la scadenza di un timeout o qualcosa nel codice php genera un'eccezione.

Installa il componente aggiuntivo firebug per firefox, se non l'hai già fatto, e controlla il callback AJAX. Sarai in grado di vedere la risposta e se riceve o meno una risposta corretta (200 OK). Puoi anche inserirne un altro alert()nel complete callback, che dovrebbe essere sicuramente invocato.


Grazie per la tua risposta. Ho provato all'allerta in caso di successo ma non ha funzionato. Ho il componente aggiuntivo firebug per Firefox e riceve una risposta corretta (200 OK), quindi nessun problema lì. Ho una funzione die chiamata nel mio file php per eventuali errori e quando lo controllo in firebug, mostra la risposta corretta. cosa intendi con "Puoi anche inserire un altro avviso () nel callback completo, che dovrebbe essere sicuramente invocato." ?? Grazie mille per una rapida risposta
codingbbq,

2
se non vedi l'avviso nel tuo success, non è un successo. poiché la risposta è 200 OK, la risposta di Tatu sembra ragionevole, ma per un'ulteriore risoluzione dei problemi, è possibile utilizzare un altro evento, chiamato completeche viene sempre invocato, indipendentemente dal fatto che una richiesta abbia esito positivo ( successsi verifica solo se la richiesta ha esito positivo). complete: function (xhr, status) { alert('complete: '+status); }
David Hedlund,

3

Ho avuto lo stesso problema. succede perché si javascriptaspettano il jsontipo di dati nella restituzione dei dati. ma se usi echo o print nel tuo php questa situazione si verifica. se usi la echofunzione dentro phpper restituire i dati, rimuovi semplicemente dataType : "json"funzionando abbastanza bene.


2

Stavo restituendo un JSON valido, ottenendo una risposta di 200 nel mio callback "completo" e potevo vederlo nella console di rete di Chrome ... MA non avevo specificato

dataType: "json"

una volta l'ho fatto, a differenza della "risposta accettata", che in realtà ha risolto il problema.


1

Sto usando XML per riportare il risultato dal php sul server alla pagina web e ho avuto lo stesso comportamento.

Nel mio caso il motivo era che il tag di chiusura non corrispondeva al tag di apertura.

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

Ho avuto questo problema utilizzando una funzione Ajax per recuperare la password dell'utente da Magento. L'evento di successo non è stato lanciato, poi ho capito che c'erano due errori:

  1. Il risultato non è stato restituito nel formato JSON
  2. Stavo cercando di convertire un array in formato JSON, ma questo array aveva caratteri non utf

Quindi ogni volta che ho provato a usare json_eoncde () per codificare l'array di ritorno, la funzione non funzionava perché uno dei suoi indici aveva caratteri non utf, molti dei quali accentuati in parole portoghesi brasiliane.


1

Ho provato a restituire la stringa dal controller ma perché il controllo ritorna al blocco degli errori non in caso di successo di 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

Ho riscontrato lo stesso problema durante l'interrogazione del controller che non restituisce la risposta di successo, quando il controller è stato modificato per restituire il problema relativo al messaggio di successo è stato risolto. nota utilizzando il framework Lavalite. prima:

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

questo ha funzionato per me


1

Ho avuto lo stesso problema, l'ho risolto in questo modo: 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');
                }
            }
        })

Ok. Il problema non riguarda json ma solo la risposta php. Prima: la mia risposta php era:

echo 'item';

Adesso:

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

Ora il mio successo funziona. PS. Scusate se c'è qualcosa che non va ma è il mio primo commento su questo forum :)


0

nel mio caso l'errore era che questo era sul lato server e per questo motivo stava restituendo un codice HTML

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

0

Aggiungi il callback "errore" (proprio come "successo") in questo modo:

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

Quindi, nel mio caso, ho visto in console:

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

0

È necessario dichiarare sia callback Success AND Error. Aggiunta

error: function(err) {...} 

dovrebbe risolvere il problema


-4

Il callback di successo accetta due argomenti:

success: function (data, textStatus) { }

Assicurarsi inoltre che submit1.phpimposta l'intestazione del tipo di contenuto corretta:application/json


Grazie per la tua risposta. Ho letto di questo su jquery ajax documentaion ma non riesco a capire quale dovrebbe essere il mio prossimo passo per farlo funzionare ... apprezzerei se potessi indicarmi la giusta direzione. Significa anche che dovrei avere qualche codice specifico nel mio file php ?? grazie mille
codingbbq,

7
il fatto che successaccetti due argomenti sembra del tutto irrilevante per la domanda. È possibile passare qualsiasi quantità di parametri a una funzione javascript, indipendentemente da quanti ne accetta nella sua dichiarazione, quindi questa non è sicuramente la causa di questi problemi e poiché nessuno dei valori datao textStatusvengono utilizzati nel callback di successo, sembra che ci sia non è una buona ragione per dichiararli nella funzione.
David Hedlund,

E i dati JSON non devono avere un'intestazione del tipo di contenuto corretta, devono solo essere in formato JSON.
Tatu Ulmanen,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.