Функция перезагрузки после нескольких срабатываний AJAX - PullRequest
1 голос
/ 16 июня 2020

В WordPress Woocommerce корзина покупок получает refre sh с AJAX, и я использую скрипт для реализации <b>+/-</b> кнопок в поле количества. <br><br>

После перезагрузки тележка с AJAX функция больше не влияет на тележку, потому что элементы перезагружены. <br><br>

Чтобы предотвратить это, я использовал ajaxComplete в качестве триггера для перезагрузки функции, но при этом и Я нажимаю кнопку +, поле ввода увеличивается в 5 раз. <br> <br>

Отладка с предупреждением показывает, что инкремент запускается 5 раз с помощью +1, а не добавления 5.

Возможно, вы видите проблему:

jQuery(document).on("ready ajaxComplete",function($){ 

    function quantityPlusMinus() {

        function releaseUpdateCartButton() {
            if (jQuery( "input[name='update_cart']" ).length) {
                if (jQuery( "input[name='update_cart']" ).is(':disabled')) {
                    jQuery( "input[name='update_cart']" ).prop("disabled", false); 
                }
            }
        }

        jQuery('div.quantity').on( 'click', '.plus, .minus', function() {
            var qty = jQuery( this ).closest( 'div.quantity' ).find( '.qty' );
            var val   = parseFloat(qty.val());
            var max = parseFloat(qty.attr( 'max' ));
            var min = parseFloat(qty.attr( 'min' ));
            var step = parseFloat(qty.attr( 'step' ));

            // Change the value if plus or minus
            if ( jQuery( this ).is( '.plus' ) ) {
               if ( max && ( max <= val ) ) {
                  qty.val( max ).change();
               } else {
                  qty.val( val + step ).change();
                  releaseUpdateCartButton();
               }
            } else {
                if ( min && ( min >= val ) ) {
                    qty.val( min ).change();
                } else if ( val > 1 ) {
                    qty.val( val - step ).change();
                    releaseUpdateCartButton();
                }
            }
        });
    }
    quantityPlusMinus();
});

1 Ответ

0 голосов
/ 18 июня 2020

Нужно запустить. Я не знаю, есть ли более умный способ сделать это, но он работает.

Если кто-то еще ищет решение:

function inputPlusMinus(ftype) {

    // Release the UpdateCartButton when click on +/- button in cart
    function releaseUpdateCartButton() {
        if (jQuery( "input[name='update_cart']" ).length) {
            if (jQuery( "input[name='update_cart']" ).is(':disabled')) {
                jQuery( "input[name='update_cart']" ).prop("disabled", false); 
            }
        }
    }

    // Check which type of function is needed, for all or just for cart
    if ( ftype == 'cart') {
        var where = '.woocommerce-cart-form div.quantity';
    }
    else {
        var where = 'div.quantity';
    }
    // Action if button is clicked
    jQuery(where).on( 'click', '.plus, .minus', function() {
        var qty = jQuery( this ).closest( 'div.quantity' ).find( '.qty' );
        var val   = parseFloat(qty.val());
        var max = parseFloat(qty.attr( 'max' ));
        var min = parseFloat(qty.attr( 'min' ));
        var step = parseFloat(qty.attr( 'step' ));

        // Change the value if plus or minus
        if ( jQuery( this ).is( '.plus' ) ) {
           if ( max && ( max <= val ) ) {
              qty.val( max ).change();
           } else {
              qty.val( val + step ).change();
              releaseUpdateCartButton();
           }
        } else {
            if ( min && ( min >= val ) ) {
                qty.val( min ).change();
            } else if ( val > 1 ) {
                qty.val( val - step ).change();
                releaseUpdateCartButton();
            }
        }
    });
}        

// Run function when page loading    
jQuery(document).on("ready",function($){ 
    inputPlusMinus();
});
// When cart is reloaded add new functionality to cart inputs
jQuery(document).on("updated_cart_totals",function($){ 
    inputPlusMinus('cart');
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...