我已经被困在这个循环中一段时间了。基本上我有一个滑块,当滑块值改变时执行一些动作。我做的第一件事是检查,如果检查没有通过,我需要重置滑块的值。但重置滑块的值会改变它!所以我卡住了。这是我的代码:
滑块:
$(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);
我认为如果我只是删除了绑定到“更改”事件的函数并重置了值,它也可以工作,但我希望有更好的方法来做到这一点!
答案 0 :(得分:1)
检查是否存在evt.originalEvent
。
如果它在那里,则用户使用自己的控件启动更改。如果不是,则表示程序已启动更改。
编辑 - 可能最简单的解决方案是在重置滑块之前暂时.unbind()
change
处理程序,然后立即再次.bind
。< / p>