Ajax nu funcționează corect în Firefox, dar merge în Chrome - Soluții și Debugging

14 iul. 2015, 02:19:00
Vizualizări: 18.2K
Voturi: 1

Lucrez la un plugin care funcționează corect în Chrome, dar nu lansează scriptul PHP via Ajax în Firefox. Această problemă mă disperă. Iată blocurile de cod relevante.

În primul rând, încărcarea JavaScript:

wp_enqueue_script ( 'jquery' );

$script_url = plugins_url ( '/js/seamless-donations.js', __FILE__ );

wp_register_script ( 'seamless_javascript_code', $script_url, array( 'jquery' ), false );
wp_enqueue_script ( 'seamless_javascript_code' );

// declară URL-ul către fișierul care gestionează cererea AJAX (wp-admin/admin-ajax.php)
wp_localize_script (
    'seamless_javascript_code', 'dgxDonateAjax',
    array(
        'ajaxurl'            => admin_url ( 'admin-ajax.php' ),
        'nonce'              => wp_create_nonce ( 'dgx-donate-nonce' ),
        'postalCodeRequired' => dgx_donate_get_countries_requiring_postal_code ()
    )
);

Acum, JavaScript-ul care face apelul Ajax:

console.log("-- SeamlessDonationsCheckout: before jQuery.post");
console.log("-- SeamlessDonationsCheckout: ajaxurl=" + dgxDonateAjax.ajaxurl);

jQuery.ajax({
    url: dgxDonateAjax.ajaxurl,
    data: data,
    success: function() {
        console.log("-- SeamlessDonationsCheckout: jQuery.ajax success");
        //response(data);
    }
});

//jQuery.post(dgxDonateAjax.ajaxurl, data, SeamlessDonationsAjaxCallback);
console.log("-- SeamlessDonationsCheckout: after jQuery.post");

Array-ul de date constă din:

var data = {
    action: 'dgx_donate_paypalstd_ajax_checkout',
    referringUrl: referringUrl,
    nonce: nonce,
    sessionID: sessionID,
    donationAmount: donationAmount,
    (și așa mai departe, este un array mare)
};

Hook-urile:

add_action ( 'wp_ajax_dgx_donate_paypalstd_ajax_checkout', 'dgx_donate_paypalstd_ajax_checkout' );
add_action ( 'wp_ajax_nopriv_dgx_donate_paypalstd_ajax_checkout', 'dgx_donate_paypalstd_ajax_checkout' );

Și, în final, începutul funcției PHP Ajax:

function dgx_donate_paypalstd_ajax_checkout () {

// Log
dgx_donate_debug_log ( '----------------------------------------' );
dgx_donate_debug_log ( 'DONATION TRANSACTION STARTED' );
$php_version = phpversion ();
dgx_donate_debug_log ( "PHP Version: $php_version" );
dgx_donate_debug_log ( "Seamless Donations Version: " . dgx_donate_get_version () );

În Chrome, fișierul de log arată clar că funcția a fost apelată, dar în Firefox nu apare nimic. De asemenea, în Chrome, consola browserului afișează intrările înainte și după apelurile jQuery.ajax, precum și mesajul "success", dar Firefox nu face acest lucru.

Pot confirma că variabila pentru URL-ul Ajax este transmisă, deoarece acest mesaj:

"-- SeamlessDonationsCheckout: ajaxurl=http://podtrack.com/wp-admin/admin-ajax.php"

apare în consola browserului Firefox. Deci nu este vorba că URL-ul Ajax nu este transmis.

Aș aprecia orice îndrumare. Această problemă m-a blocat complet.

Mulțumesc!

--David

4
Comentarii

în Firefox este Console.log nu console.log, ambele sunt API-uri specifice browserului

Tom J Nowell Tom J Nowell
14 iul. 2015 02:26:49

Mulțumesc, Tom. Din păcate, chiar și folosind Console.log, nu afișează mesajul de succes.

David Gewirtz David Gewirtz
14 iul. 2015 02:32:10

Cred că variabila ta nonce din date ar trebui să fie nonce: dgxDonateAjax.nonce,; nu nonce: nonce,.

josh josh
14 iul. 2015 06:31:51

Bine. Mai întâi de toate, poți verifica dacă se face un apel AJAX în consola Firefox?

WPTC-Troop WPTC-Troop
16 dec. 2015 13:59:02
Toate răspunsurile la întrebare 2
0

Acesta este scheletul de bază pentru un apel și răspuns AJAX. Verifică și asigură-te că funcționează în Chrome și Firefox pentru tine — pentru mine funcționează.

<?php

// O funcție pentru datele pe care le vom transmite

function dgx_donate_get_countries_requiring_postal_code()
{
    return "cc cod poștal chestii...";
}

// Înregistrăm totul

add_action('init', function () {

    // Adăugăm scripturile necesare

    wp_enqueue_script('jquery');
    $script_url = plugins_url('/js/seamless-donations.js', __FILE__);

    wp_register_script('seamless_javascript_code', $script_url, array('jquery'), false);
    wp_enqueue_script('seamless_javascript_code');

    // Localizăm datele noastre

    wp_localize_script(
        'seamless_javascript_code', 'dgxDonateAjax',
        array(
            'ajaxurl' => admin_url('admin-ajax.php'),
            'nonce' => wp_create_nonce('dgx-donate-nonce'),
            'postalCodeRequired' => dgx_donate_get_countries_requiring_postal_code()
        )
    );

    // Înregistrăm gestionarii AJAX

    add_action('wp_ajax_dgx_donate_paypalstd_ajax_checkout', 'dgx_donate_paypalstd_ajax_checkout');
    add_action('wp_ajax_nopriv_dgx_donate_paypalstd_ajax_checkout', 'dgx_donate_paypalstd_ajax_checkout');

    // Gestionarul AJAX (PRIV / NO PRIV)

    function dgx_donate_paypalstd_ajax_checkout()
    {
        // Dacă eșuăm, nu fi tăcut

        $fail_message = '';

        if (empty($_POST['nonce']) || !wp_verify_nonce($_POST['nonce'], 'dgx-donate-nonce')) $fail_message = 'Nonce incorect';
        if (empty ($_POST['action'])) $fail_message = 'Acțiune lipsă';
        if ($_POST['action'] !== 'dgx_donate_paypalstd_ajax_checkout') $fail_message = 'Acțiune incorectă';

        // Am eșuat, să le spunem...

        if (!empty ($fail_message)) {
            wp_send_json_error(array(
                'message' => $fail_message
            )); // die
        }

        // Facem logica necesară

        // Trimitem Răspunsul de Succes

        wp_send_json_success(array(
            'action' => $_POST['action'],
            'message' => 'Finalizare cu succes',
            'postalCodeRequired' => $_POST['postalCodeRequired'],
            'ID' => 1
        )); // die
    }
});

// Scurtătură pentru a declanșa apelul AJAX la încărcarea paginii

add_action('wp_footer', function () { ?>

    <script>

        (function ($) {

            var data = {
                action: 'dgx_donate_paypalstd_ajax_checkout',
                nonce: dgxDonateAjax.nonce,
                postalCodeRequired: dgxDonateAjax.postalCodeRequired,
            };

            $.ajax({
                type: 'POST',
                url: dgxDonateAjax.ajaxurl,
                data: data,
                success: function (response) {

                    // uită-te la răspuns

                    if (response.success) {

                        // date de succes
                        console.log(response.data);

                    } else {

                        // nu e bine
                        console.log(response);
                    }
                }
            });

        })(jQuery);
    </script>
<?php });
16 dec. 2015 16:45:36
3

Ai nevoie de type: 'POST' în apelul tău jQuery.ajax. Valoarea implicită este GET, iar acest lucru necesită POST.

Deoarece cineva a cerut un exemplu mai jos:

jQuery.ajax({
    url: dgxDonateAjax.ajaxurl,
    data: data,
    type: 'POST',
    success: function() {
        console.log("-- SeamlessDonationsCheckout: jQuery.ajax success");
        //response(data);
    }
});
14 iul. 2015 19:10:56
Comentarii

Poți oferi un exemplu?

Howdy_McGee Howdy_McGee
14 iul. 2015 19:39:00

Cred că response trebuie să fie și el în argumentele funcției?? success: function(response) {

josh josh
16 iul. 2015 08:13:33

În mod ideal da, dar pentru scopul depanării aici nu e nevoie să fie prezent. Codul lui folosește doar console.log pentru a confirma succesul ajax-ului și ar fi inutil să transmită response doar ca să-l ignore.

voldemortensen voldemortensen
21 iul. 2015 02:07:05