Устранить конфликт c ajax

Главные вкладки

Аватар пользователя lkm lkm 9 февраля 2016 в 15:46

Есть js код, который добавляет плюс-минус к выбору количества. если в товаре присутствую атрибуты, то при их смене скрипт слетает и количество отображается как стандартный инпут. Подскажите как в данной конкретном случае устранить конфликт с аяксом при смене атрибутов? Пробовала разные варианты - пока не помогло

function($) {
    "use strict";
    /* -------------------------------------------------------------------------
     QUANTITY INPUT
     ------------------------------------------------------------------------- */

    $.fn.lvQuantityInput = function(){

        var $this = $(this),
            input = $this.find( 'input' ),
            value = parseInt( input.val() ),
            minValue = input.prop( 'min' ) ? parseInt( input.prop( 'min' ) ) : 0,
            maxValue = input.prop( 'max' ) ? parseInt( input.prop( 'max' ) ) : 100,
            step = input.prop( 'step' ) ? parseInt( input.prop( 'step' ) ) : 1;

        // CREATE ELEMENTS
        input.hide();
        $this.append( '<div class="quantity"><input class="minus" type="button" value="-"><input class="input-text qty text fake-input" type="text" name="quantity" value="' + value + '" title="Quantity " size="4"><input class="plus" type="button" value="+"></div>' );
        var plus = $this.find( '.plus' ),
            minus = $this.find( '.minus' ),
            fakeInput = $this.find( '.fake-input' );

        // ACTIONS
        minus.click(function(){
            if ( ( value - step ) >= minValue ) {
                value -= step;
                fakeInput.val( value );
                fakeInput.trigger( 'change' );
            }
        });
        plus.click(function(){
            if ( ( value + step ) <= maxValue ) {
                value += step;
                fakeInput.val( value );
                fakeInput.trigger( 'change' );
            }
        });
        fakeInput.change(function(){
            if ( ! isNaN( fakeInput.val() ) ) {
                value = parseInt( fakeInput.val() );
                input.val( value );
            }
        });
    };

    $(document).ready(function(){
        if ($('.content-flickr').length) {
            $('.content-flickr').jflickrfeed({
                limit: Drupal.settings.flick.flick_setting_numberphoto,
                qstrings: {
                    id: Drupal.settings.flick.flick_setting_id
                },
                itemTemplate: '<li><a title="{{title}}" href="{{image}}"><img src="{{image_s}}" alt="{{title}}" width="75" height="75"></a></li>'
            });
        }
        // QUANTITY INPUTS
        if ( $.fn.lvQuantityInput ) {
            $( '.form-item-quantity' ).each(function(){
                $(this).lvQuantityInput();
            });
            $( '#views-form-commerce-cart-form-default .views-field-edit-quantity .form-item' ).each(function(){
                $(this).lvQuantityInput();
            });
        }

})(jQuery);
        //

Комментарии

Аватар пользователя sg85 sg85 9 февраля 2016 в 17:58

Когда срабатывает аякс событие друпала, вызывается Drupal.attachBehaviors, соответственно, код по присоединению плагина к инпуту нужно разместить внутри Вашего "поведения", а так же позаботиться о том, чтобы этот код не срабатывал по 100500 раз при любом аякс запросе на одних и тех же элементах, тут Вам может помочь once. Словом, погуглите сперва "drupal behaviors", а затем "drupal jquery once", информации там было много на эту тему

PS Когда пишете jQuery плагин, старайтесь each размещать внутри самого плагина, а иначе получается ерунда.