1

私はしばらくこのループに陥っています。基本的に、スライダーの値が変化したときに何らかのアクションを実行するスライダーがあります。最初にチェックを行い、チェックが通らない場合は、スライダーの値をリセットする必要があります。しかし、スライダーの値をリセットすると、それが変わります!そして、私は立ち往生しています。これが私のコードです:

スライダー:

    $(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 は常に未定義です (この console.log(evt.originalEvent) のように cosole.log を作成した場合) が、何らかの奇妙な理由で console.dir にすると表示されます。しかし、残念ながら問題は解決しません。ここに、スライダーの値を変更するコードの一部を追加します (以前に忘れていたことを許してください)。

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

ご覧のとおり、値は最初にプログラムによって変更されるため、evt.originalEvent のチェックはとにかく役に立ちません。

EDIT 2 - 私はこれから抜け出す方法を見つけましたが、もっと良い方法があることを願っています:

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

「変更」イベントにバインドされた関数を削除して値をリセットするだけでも機能すると思いますが、これを行うより良い方法があることを願っています!

4

1 に答える 1

1

の存在を確認しevt.originalEventます。

そこにある場合は、ユーザーが独自のコントロールを使用して変更を開始したことを示します。そうでない場合は、プログラムが変更を開始したことを示します。

編集- おそらく最も簡単な解決策は、スライダーをリセットする前に一時的.unbind()にハンドラーを実行し、その後すぐに再度実行することです。change.bind

于 2011-06-14T08:20:46.027 に答える