Ajax no se ejecuta correctamente en Firefox pero funciona en Chrome

14 jul 2015, 02:19:00
Vistas: 18.2K
Votos: 1

Estoy trabajando en un plugin que parece funcionar bien en Chrome, pero no ejecuta el script PHP mediante Ajax en Firefox. Me está volviendo loco. Aquí están los bloques de código relacionados.

Primero, la cola de 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' );

// declarar la URL al archivo que maneja la solicitud 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 ()
    )
);

Ahora, el JavaScript relacionado que hace la llamada Ajax:

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

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

//jQuery.post(dgxDonateAjax.ajaxurl, data, SeamlessDonationsAjaxCallback);
console.log("-- SeamlessDonationsCheckout: después de jQuery.post");

El array de datos consiste en:

var data = {
    action: 'dgx_donate_paypalstd_ajax_checkout',
    referringUrl: referringUrl,
    nonce: nonce,
    sessionID: sessionID,
    donationAmount: donationAmount,
    (y así sucesivamente, es un array grande)
};

Los hooks:

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' );

Y, finalmente, el comienzo de la función PHP Ajax:

function dgx_donate_paypalstd_ajax_checkout () {

// Registro
dgx_donate_debug_log ( '----------------------------------------' );
dgx_donate_debug_log ( 'INICIO DE TRANSACCIÓN DE DONACIÓN' );
$php_version = phpversion ();
dgx_donate_debug_log ( "Versión PHP: $php_version" );
dgx_donate_debug_log ( "Versión de Seamless Donations: " . dgx_donate_get_version () );

En Chrome, el archivo de registro muestra claramente que la función ha sido llamada, pero no hay nada en Firefox. Además, en Chrome, el registro del navegador muestra las entradas antes y después de las llamadas jQuery.ajax, así como la entrada de "éxito", pero Firefox no lo hace.

Puedo confirmar que la variable para la URL Ajax se pasa, porque este mensaje

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

aparece en la consola del navegador Firefox. Así que no es que la URL ajax no se esté pasando.

Realmente agradecería cualquier orientación. Este problema me tiene muy perplejo.

¡Gracias!

--David

4
Comentarios

en Firefox es Console.log no console.log, ambas son APIs específicas del navegador

Tom J Nowell Tom J Nowell
14 jul 2015 02:26:49

Gracias, Tom. Lamentablemente, incluso usando Console.log, no está mostrando el mensaje de éxito.

David Gewirtz David Gewirtz
14 jul 2015 02:32:10

Creo que tu variable data nonce debería ser nonce: dgxDonateAjax.nonce,; no nonce: nonce,.

josh josh
14 jul 2015 06:31:51

Ok. Primero que todo, ¿puedes ver si hay una llamada AJAX en la consola de Firefox?

WPTC-Troop WPTC-Troop
16 dic 2015 13:59:02
Todas las respuestas a la pregunta 2
0

Este es el esqueleto básico para una llamada y respuesta AJAX. Échale un vistazo y asegúrate de que funcione en Chrome y Firefox para ti - a mí me funciona.

<?php

// Alguna función para los datos que pasaremos

function dgx_donate_get_countries_requiring_postal_code()
{
    return "cc código postal cosas...";
}

// Registrar todo

add_action('init', function () {

    // Añadir scripts requeridos

    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');

    // Localizar nuestros datos

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

    // Registrar manejadores 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');

    // Manejador AJAX (PRIV / NO PRIV)

    function dgx_donate_paypalstd_ajax_checkout()
    {
        // Si fallamos, no te quedes callado

        $fail_message = '';

        if (empty($_POST['nonce']) || !wp_verify_nonce($_POST['nonce'], 'dgx-donate-nonce')) $fail_message = 'Nonce incorrecto';
        if (empty ($_POST['action'])) $fail_message = 'Falta la acción';
        if ($_POST['action'] !== 'dgx_donate_paypalstd_ajax_checkout') $fail_message = 'Acción incorrecta';

        // Fallamos, avisemos...

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

        // Hacer lógica de cosas

        // Enviar la respuesta de éxito

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

// Atajo para activar la llamada AJAX al cargar la página

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) {

                    // mira la respuesta

                    if (response.success) {

                        // datos de éxito
                        console.log(response.data);

                    } else {

                        // no bien
                        console.log(response);
                    }
                }
            });

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

Necesitas type: 'POST' en tu llamada jQuery.ajax. El valor por defecto es GET, y esto requiere POST.

Porque alguien más abajo solicitó un ejemplo:

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

¿Puedes proporcionar un ejemplo?

Howdy_McGee Howdy_McGee
14 jul 2015 19:39:00

Creo que response también debe estar en los argumentos de la función?? success: function(response) {

josh josh
16 jul 2015 08:13:33

Idealmente sí, pero para los propósitos de depuración aquí no tiene que estar. Su código solo está usando console.log para confirmar el éxito del ajax y sería inútil pasar response solo para ignorarlo.

voldemortensen voldemortensen
21 jul 2015 02:07:05