jquery — вызывается и отменяется из файла admin-ajax.php несколько раз

У меня проблема с установкой WordPress с плагином. Существует календарь, который вы можете нажать на день (или диапазон дней) и от звонков через Ajax через admin-ajax.php он рассчитывает стоимость продукта.

Проблема в том, что когда я нажимаю на ячейку календаря, admin-ajax.php называется дважды. Первый раз за несколько миллисекунд и отменен сразу. Затем автоматически он вызывает его еще раз и получает ответ ajax. Когда я нажимаю второй раз на ячейку календаря, admin-ajax.php называется 3 раза. Первые два отменяются, и только последний получает ответ.

Я обнаружил, что код, который используется для этой части, следующий. Тем не менее, я не могу найти никаких проблем, даже если я вижу эти отмененные вызовы на консоли разработчика.

$('.wc-bookings-booking-form')
.on('change', 'input, select', function() {
var index = $('.wc-bookings-booking-form').index(this);

if ( xhr[index] ) {
xhr[index].abort();
}

$form = $(this).closest('form');

var required_fields = $form.find('input.required_for_calculation');
var filled          = true;
$.each( required_fields, function( index, field ) {
var value = $(field).val();
if ( ! value ) {
filled = false;
}
});
if ( ! filled ) {
$form.find('.wc-bookings-booking-cost').hide();
return;
}

$form.find('.wc-bookings-booking-cost').block({message: null, overlayCSS: {background: '#fff', backgroundSize: '16px 16px', opacity: 0.6}}).show();

xhr[index] = $.ajax({
type:       'POST',
url:        booking_form_params.ajax_url,
data:       {
action: 'wc_bookings_calculate_costs',
form:   $form.serialize()
},
success:    function( code ) {
if ( code.charAt(0) !== '{' ) {
console.log( code );
code = '{' + code.split(/\{(.+)?/)[1];
}

result = $.parseJSON( code );

if ( result.result == 'ERROR' ) {
$form.find('.wc-bookings-booking-cost').html( result.html );
$form.find('.wc-bookings-booking-cost').unblock();
$form.find('.single_add_to_cart_button').addClass('disabled');
} else if ( result.result == 'SUCCESS' ) {
$form.find('.wc-bookings-booking-cost').html( result.html );
$form.find('.wc-bookings-booking-cost').unblock();
$form.find('.single_add_to_cart_button').removeClass('disabled');
} else {
$form.find('.wc-bookings-booking-cost').hide();
$form.find('.single_add_to_cart_button').addClass('disabled');
console.log( code );
}
},
error: function() {
$form.find('.wc-bookings-booking-cost').hide();
$form.find('.single_add_to_cart_button').addClass('disabled');
},
dataType:   "html"});
})
.each(function(){
var button = $(this).closest('form').find('.single_add_to_cart_button');

button.addClass('disabled');
});

А вот скриншот с консоли разработчика:
введите описание изображения здесь

РЕДАКТИРОВАТЬ: Я думаю, что нашел проблему, но я не уверен. Есть также эта часть кода, которая должна была вообще не использоваться. В календаре есть функция времени, но она не активирована. Таким образом, этот код не должен быть запущен.

$('.wc-bookings-booking-form').on( 'date-selected', function() {
show_available_time_blocks( this );
});

var xhr;

function show_available_time_blocks( element ) {
var $form               = $(element).closest('form');
var block_picker        = $form.find('.block-picker');
var fieldset            = $form.find('.wc_bookings_field_start_date');

var year  = parseInt( fieldset.find( 'input.booking_date_year' ).val(), 10 );
var month = parseInt( fieldset.find( 'input.booking_date_month' ).val(), 10 );
var day   = parseInt( fieldset.find( 'input.booking_date_day' ).val(), 10 );

if ( ! year || ! month || ! day ) {
return;
}

// clear blocks
block_picker.closest('div').find('input').val( '' ).change();
block_picker.closest('div').block({message: null, overlayCSS: {background: '#fff', backgroundSize: '16px 16px', opacity: 0.6}}).show();

// Get blocks via ajax
if ( xhr ) xhr.abort();

xhr = $.ajax({
type:       'POST',
url:        booking_form_params.ajax_url,
data:       {
action: 'wc_bookings_get_blocks',
form:   $form.serialize()
},
success: function( code ) {
block_picker.html( code );
resize_blocks();
block_picker.closest('div').unblock();
},
dataType:   "html"});
}

1

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector