Callback di successo condizionale basato sulla risposta Ajax non funziona

20 feb 2014, 20:48:16
Visualizzazioni: 15.5K
Voti: 1

Sto cercando di eseguire una richiesta ajax per passare alcuni dati a una funzione che ho scritto. Restituisco la risposta e provo a eseguire del codice javascript basato sulla risposta, ma sembra non funzionare correttamente. Indipendentemente dalla risposta ricevuta, viene sempre eseguito come se la risposta non fosse 'Everything's Chimpy!'

jQuery.ajax({
    type: 'POST',
    url: ajaxurl,
    data: {
        action:      'chimp_form',
        form_action: 'validate_api_key', 
        api_key:     apiKey,
        data_center: dataCenter
    },
    success: function(validation_response) {
        // alert(validation_response);
        if(validation_response == "Everything's Chimpy!") {
            jQuery('.mailChimp_api_key_preloader')
                .fadeOut('fast', function() {
                    jQuery('.mailChimp_api_key_validation_message')
                        .html('<img src="/images/mc-checkmark.png" alt="Messaggio di successo" title="Chiave API valida"> Valid API Key')
                        .css("color", "green").fadeIn();
                });
        } else {
            // alert(response);
            jQuery('.mailChimp_api_key_preloader')
                .fadeOut('fast', function() {
                    jQuery('.mailChimp_api_key_validation_message')
                        .html('<img src="/images/yikes-mc-error-icon.png" alt="Messaggio di errore" title="Errore chiave API"> Error: '+validation_response+'.')
                        .css("color", "red").fadeIn();
                });                             
        };
    },
    error: function(response) {
        alert('Si è verificato un errore durante l\'elaborazione della richiesta...'); 
    }
});

Sto ricevendo una risposta dalla richiesta ajax che dice 'Everything's Chimpy!', ma la mia condizione non viene eseguita. Indipendentemente dalla risposta, la funzione success esegue sempre il secondo blocco condizionale. Ho testato la risposta e posso verificare che corrisponde alla mia prima condizione.

Perché non viene eseguito il primo blocco?

La parte più strana è che... ho sviluppato questo codice su un'installazione localhost. Quando l'ho trasferito sul sito live, questa richiesta ajax e il callback di successo non funzionano come su localhost. Non riesco a trovare una ragione per cui dovrebbe comportarsi diversamente su localhost rispetto al sito live.

Questa è la risposta che viene restituita: Error: Everything's Chimpy!.

3
Commenti

come si presenta il php che restituisce il valore? sei sicuro che non ci sia un newline o qualcosa del genere?

Milo Milo
20 feb 2014 21:14:27

È consuetudine aggiungere la soluzione come risposta, non alla tua domanda - puoi farlo per favore.

Nicolai Grossherr Nicolai Grossherr
20 feb 2014 22:27:42

ops scusa per quello. Non intendevo inserirlo sotto la mia domanda originale.

EHerman EHerman
20 feb 2014 22:40:46
Tutte le risposte alla domanda 3
1

Risparmia un po' di fatica e esamina invece le funzioni wp_send_json_success() e wp_send_json_error(). Queste ti permetteranno di inviare dati da PHP e automaticamente restituire valori di successo per il codice javascript da esaminare.

20 feb 2014 21:25:55
Commenti

Grazie Otto. In realtà sono riuscito a ottenere questo risultato usando: if(response.indexOf('Everything\'s Chimpy!') > -1) {. Forse tornerò più avanti e implementerò quello che hai suggerito.

EHerman EHerman
20 feb 2014 22:23:46
0

Una ragione potrebbe essere che la richiesta AJAX tramite jQuery per impostazione predefinita utilizza async: true, e la risposta arriva troppo tardi (localhost è spesso più veloce). Prova con async: false. Questo ha risolto il problema almeno in un caso simile che ho affrontato di recente.

Un altro dettaglio importante: il codice di stato HTTP della tua risposta dovrebbe essere 200. Quindi nella tua callback, aggiungi questa riga all'inizio, prima di inviare qualsiasi output:

status_header( 200 );
20 feb 2014 21:18:09
0

Alla fine ho optato per:

 if(response.indexOf('Tutto è Chimpy!') > -1) {

    } else {

    }

e funziona perfettamente. Grazie per le risposte!

20 feb 2014 22:41:21