Ajax не работает корректно в Firefox, но работает в Chrome

14 июл. 2015 г., 02:19:00
Просмотры: 18.2K
Голосов: 1

Я работаю над плагином, который корректно работает в Chrome, но не запускает PHP скрипт через Ajax в Firefox. Это сводит меня с ума. Вот относящиеся к проблеме блоки кода.

Сначала подключение 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' );

// объявляем URL файла, который обрабатывает 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 ()
    )
);

Теперь JavaScript, который делает Ajax вызов:

console.log("-- SeamlessDonationsCheckout: перед jQuery.post");
console.log("-- SeamlessDonationsCheckout: ajaxurl=" + dgxDonateAjax.ajaxurl);

jQuery.ajax({
    url: dgxDonateAjax.ajaxurl,
    data: data,
    success: function() {
        console.log("-- SeamlessDonationsCheckout: jQuery.ajax успешно");
        //response(data);
    }
});

//jQuery.post(dgxDonateAjax.ajaxurl, data, SeamlessDonationsAjaxCallback);
console.log("-- SeamlessDonationsCheckout: после jQuery.post");

Массив данных состоит из:

var data = {
    action: 'dgx_donate_paypalstd_ajax_checkout',
    referringUrl: referringUrl,
    nonce: nonce,
    sessionID: sessionID,
    donationAmount: donationAmount,
     так далее, это большой массив)
};

Хуки:

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

И, наконец, начало PHP Ajax функции:

function dgx_donate_paypalstd_ajax_checkout () {

// Логирование
dgx_donate_debug_log ( '----------------------------------------' );
dgx_donate_debug_log ( 'НАЧАЛО ТРАНЗАКЦИИ ПОЖЕРТВОВАНИЯ' );
$php_version = phpversion ();
dgx_donate_debug_log ( "Версия PHP: $php_version" );
dgx_donate_debug_log ( "Версия Seamless Donations: " . dgx_donate_get_version () );

В Chrome лог-файл четко показывает, что функция была вызвана, но в Firefox ничего нет. Также в Chrome лог браузера показывает записи до и после вызовов jQuery.ajax, включая запись "success", но в Firefox этого нет.

Я могу подтвердить, что переменная для Ajax URL передается, потому что это сообщение

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

отображается в консоли Firefox. Так что дело не в том, что ajax URL не передается.

Буду очень признателен за любые подсказки. Эта проблема меня полностью поставила в тупик.

Спасибо!

--Дэвид

4
Комментарии

в Firefox используется Console.log, а не console.log, это специфичные для браузера API

Tom J Nowell Tom J Nowell
14 июл. 2015 г. 02:26:49

Спасибо, Том. К сожалению, даже при использовании Console.log сообщение об успехе не срабатывает.

David Gewirtz David Gewirtz
14 июл. 2015 г. 02:32:10

Думаю, в вашей переменной data nonce должно быть nonce: dgxDonateAjax.nonce,, а не nonce: nonce,.

josh josh
14 июл. 2015 г. 06:31:51

Хорошо. Прежде всего, можешь проверить, выполняется ли ajax-запрос в консоли Firefox?

WPTC-Troop WPTC-Troop
16 дек. 2015 г. 13:59:02
Все ответы на вопрос 2
0

Это минимальный код для AJAX-запроса и ответа. Убедитесь, что он работает в Chrome и Firefox — у меня всё работает.

<?php

// Функция для получения данных, которые мы передадим

function dgx_donate_get_countries_requiring_postal_code()
{
    return "информация о почтовом коде страны...";
}

// Регистрируем всё необходимое

add_action('init', function () {

    // Подключаем необходимые скрипты

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

    // Локализуем наши данные 

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

    // Регистрируем обработчики 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');

    // Обработчик AJAX (для авторизованных и неавторизованных пользователей)

    function dgx_donate_paypalstd_ajax_checkout()
    {
        // Если что-то пошло не так, сообщаем об этом 

        $fail_message = '';

        if (empty($_POST['nonce']) || !wp_verify_nonce($_POST['nonce'], 'dgx-donate-nonce')) $fail_message = 'Неверный Nonce';
        if (empty ($_POST['action'])) $fail_message = 'Отсутствует Action';
        if ($_POST['action'] !== 'dgx_donate_paypalstd_ajax_checkout') $fail_message = 'Неверный Action';

        // Если обнаружена ошибка, сообщаем об этом...

        if (!empty ($fail_message)) {
            wp_send_json_error(array(
                'message' => $fail_message
            )); // завершаем выполнение
        }

        // Выполняем логику

        // Отправляем успешный ответ

        wp_send_json_success(array(
            'action' => $_POST['action'],
            'message' => 'Оплата завершена',
            'postalCodeRequired' => $_POST['postalCodeRequired'],
            'ID' => 1
        )); // завершаем выполнение
    }
});

// Быстрый способ вызвать AJAX-запрос при загрузке страницы

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

                    // анализируем ответ 

                    if (response.success) {

                        // успешные данные
                        console.log(response.data);

                    } else {

                        // что-то пошло не так
                        console.log(response);
                    }
                }
            });

        })(jQuery);
    </script>
<?php });
16 дек. 2015 г. 16:45:36
3

Вам необходимо type: 'POST' в вашем вызове jQuery.ajax. По умолчанию используется GET, а здесь требуется POST.

Так как кто-то ниже попросил пример:

jQuery.ajax({
    url: dgxDonateAjax.ajaxurl,
    data: data,
    type: 'POST',
    success: function() {
        console.log("-- SeamlessDonationsCheckout: jQuery.ajax success");
        //response(data);
    }
});
14 июл. 2015 г. 19:10:56
Комментарии

Можете привести пример?

Howdy_McGee Howdy_McGee
14 июл. 2015 г. 19:39:00

Я думаю, response тоже должен быть в аргументах функции?? success: function(response) {

josh josh
16 июл. 2015 г. 08:13:33

В идеале - да, но для целей отладки в данном случае это не обязательно. Его код просто использует console.log для подтверждения успешности ajax-запроса, и передавать response только чтобы его игнорировать - бессмысленно.

voldemortensen voldemortensen
21 июл. 2015 г. 02:07:05