Как изменить значение ползунка jquery в событии смены слайдов, не вызывая другого события смены слайдов

я застрял в этой петле на некоторое время. В основном у меня есть ползунок, который выполняет какое-то действие при изменении значений ползунка. Первое, что я делаю, это проверяю, и если эта проверка не проходит, мне нужно сбросить значение ползунка. Но сброс значения ползунка меняет его! И так я застрял. Вот мой код:

Слайдер:

    $(element).slider({
        min: 0,
        max: 10,
        step: 1,
        value: initialValue,
        animate: false,
        slide: _updateOnSlide,
        change: _performAction
    }); 

var _performAction = function(evt, ui){
    if (CT.travel.atLeastOneStepPresent()){
        var id = $(this).attr("id");

        _updateOnSlide(evt, ui);

        if (id != "travelTime"){//se è il tempo non aggiorno


            CT.makeQuery();

        }
        CT.timeline.update();
    }else{
        alert("you can't do this");
        $(this).slider("value", 0);
        _updateOnSlide(evt, ui);
    }
}

Проблема в том, что $(this).slider("value", 0); запускает другое событие изменения! Кто-нибудь знает, как это решить?

Мне нужно использовать функцию изменения, потому что я меняю значения ползунка, нажимая кнопки, а не сдвигая его.

РЕДАКТИРОВАТЬ - evt.originalEvent для меня всегда не определено (если я использую cosole.log, это похоже на этот console.log(evt.originalEvent)) но по какой-то странной причине я вижу его, если я использую console.dir. Но, к сожалению, это не решает проблему, я добавляю сюда часть моего кода, которая меняет значение ползунка (извините, я забыл сделать это раньше)

            $('.plus').click(function(event){
                var sliderCurrentValue = $( this ).next().slider( "value" );
                $(this).next().slider( "value", sliderCurrentValue + 1 );
            });

Как видите, значение изменяется программно в первый раз, поэтому проверка evt.originalEvent в любом случае бесполезна.

РЕДАКТИРОВАТЬ 2 - я нашел выход из этого, но я надеюсь, что есть лучший способ:

        alert("you can't do this");
                    //destroy the slider
        $(this).slider("destroy");
                    // recreate the slider
        _makeSelector(this);

Я думаю, что это также могло бы работать, если бы я просто удалил функцию, связанную с событием «изменить», и сбросил значение, но я надеюсь, что есть лучший способ сделать это!


person Nicola Peluchetti    schedule 14.06.2011    source источник


Ответы (1)


Проверьте наличие evt.originalEvent.

Если он есть, изменение было инициировано пользователем с помощью собственных элементов управления. Если это не так, это указывает на изменение, инициированное программой.

РЕДАКТИРОВАНИЕ. Вероятно, самое простое решение — временно .unbind() обработчик change перед сбросом ползунка, а затем .bind снова сразу после этого.

person Alnitak    schedule 14.06.2011
comment
Я отредактировал свой ответ, извините, я забыл сказать, что меняю значение ползунка программно. - person Nicola Peluchetti; 14.06.2011