2009-04-30 18 views
8

mi sono seguente codice:presentare il modulo non si ferma in jquery ajax chiamata

$.ajax({ 
    type: "POST", 
    async: false,    
    url: "CheckIdExist", 
    data: param, 
    success: function(result) { 
     if (result == true){ 
      return false; 
     }         
    }, 
    error: function(error) { 
     alert(error); 
     return false; 
    } 
}); 

se il valore di ritorno ajax è vero, la forma ha bisogno di smettere di presentare.

ma non interrompe il modulo di invio.

qualsiasi aiuto per favore.

risposta

1

In questo caso è necessario eseguire una richiesta HTTP sincrona, ovvero impostare the async option su falso.
Nella tua versione la richiesta httpxml è asincrona. Potrebbe essere terminato molto tempo dopo che è stato restituito il gestore onsubmit e la richiamata onsuccess viene richiamata dal contesto del gestore onsubmit.
Il "ritorno falso" sarà il valore di ritorno della funzione di funzione anonima (risultato) {...} e non il valore di ritorno del gestore onsubmit.

2

È necessario eseguire una richiamata.

This entry in the FAQ mi ha aiutato molto quando ho avuto questo problema esatto.

getUrlStatus('getStatus.php', function(status) { 
    alert(status); 
}); 

function getUrlStatus(url, callback) { 
    $.ajax({ 
     url: url, 
     complete: function(xhr) { 
      callback(xhr.status); 
     } 
    }); 
} 

La ragione di questo è che non è possibile tornare in una funzione AJAX.

Il codice sopra riportato non funziona come desiderato a causa della natura della programmazione asincrona. Il gestore di successo fornito non viene richiamato immediatamente, ma piuttosto in un momento successivo in cui la risposta viene ricevuta dal server. Quindi, quando usiamo la variabile 'status' subito dopo la chiamata $ .ajax, il suo valore è ancora indefinito.

1

Non si può mettere questo codice in una funzione o in onsubmit di una forma, la funzione restituisce il successo è frutto di tornare al contesto ajax jQuery, non la forma presentare contesto.

+0

Parte del problema, ma principalmente il problema è che la funzione ajax è asincrona e quindi non può restituire un valore perché l'esecuzione del codice non attende il completamento di questa funzione. – Sylverdrag

15

io suppone che si abbia qualcosa di simile:

form.submit(function(event) { 
    $.ajax(...); 
}); 

Volete return false (o chiamare event.preventDefault()) nella gestione degli eventi funzione stessa, e non nella chiamata AJAX, come ad esempio:

form.submit(function(event) { 
    $.ajax(...); 
    event.preventDefault(); 
}); 
+2

Eccellente: l'utilizzo di event.preventDefault() ha risolto il problema e impedito l'aggiornamento della pagina quando l'utente fa clic su un pulsante nel mio modulo. Grazie DarkWulf! –

+0

non funziona per jquery 1.8.3 –

1

Ho avuto questo problema, ma ho risolto cambiando il tipo di input = "submit" per type = "button" e poi faccio la tua richiesta Ajax

$("input#submitbutton") 
    { 
          $.ajax(
         {       type: "POST", 
          async: false,    
          url: "CheckIdExist", 
          data: param, 
          success: function(result) { 
           if (result == true){ 
            //TODO: do you magic 
           }      
           else 
            $("form").submit();   
          }, 
          error: function(error) { 
           alert(error); 
           return false; 
          } 
         }); 
    }); 
7

Una leggera variazione di questa domanda è: Voglio usare jquery e ajax per presentare un messaggio di errore a un utente, , ma poi fare un'elaborazione normale se non ci sono errori.

Supponiamo che il metodo "check" restituisca una risposta che è vuota se non vi è errore e contiene gli errori in esso presenti.

Poi si può fare qualcosa di simile nella funzione pronta:

$("#theform").submit(function() { 
    var data = { ... } 
    $.get('/check', data, 
     function(resp) { 
      if (resp.length > 0) { 
       $("#error").html(resp); 
      } else { 
       $("#theform").unbind('submit'); 
       $("#theform").submit(); 
      } 
    }); 
    event.preventDefault(); 
}); 

Allora, come funziona?Quando viene attivata la funzione di invio esterno, crea i dati necessari per la chiamata AJAX (qui la funzione di livello superiore ottiene). La chiamata è pianificata e il thread principale di operazione continua immediatamente, ma l'invio viene arrestato incondizionatamente, quindi non accade nulla di evidente.

Alcuni passaggi di tempo e la chiamata AJAX restituisce il risultato della richiesta. Se non vuoto, il risultato viene mostrato all'utente.

Se la risposta è vuota, tuttavia, la funzione di invio non è associata. Ciò impedisce al ssytem di effettuare una chiamata extra attraverso la funzione di invio esterno. Viene chiamata la funzione di invio interno. Questo innesca una vera e propria sottomissione della forma al bersaglio della forma, e la vita continua come previsto.

+0

'form.unbind ('submit')' - brilliant! Molto più pulito di 'form.trigger ('submit', [something])' che comunque non ha funzionato per me. –

+0

Stavo usando google per creare una chiamata di geocodifica asincrona basata su uno degli input del mio modulo e impostando altri valori basati sulla geocodifica. Il modulo veniva sempre inviato prima della fine del geocoding. Il form.unbind è stato davvero utile e ha risolto il mio problema. – joshcartme

Problemi correlati