我有自己的JavaScript Slider库,我已经开发了它。它很有效,当我只初始化一个滑块,但有一些问题,当有多个Slider初始化时。
正如你在这里看到的: http://jsfiddle.net/bingo14/bhymxrqr/6/
最后一个滑块工作顺畅而完美,但前两个并不能解决问题所在。如果您在拖动时开始拖动第一个滑块并使用光标进行一些圆周运动,则滑块会停止!由于某种原因,最后一个没有发生。
我的事件处理程序可能有问题吗?
dragger.onmousedown = dragStart;
dragger.onmousemove = dragMove;
dragger.onmouseup = dragStop;
window.onmousemove = dragMove;
window.onmouseup = dragStop;
.....
答案 0 :(得分:2)
当你写: window.onmousemove = dragMove; window.onmouseup = dragStop;
你实际上设置了window.onmousemove / onmouseup函数。也就是说,如果先前设置了某些功能,则下一个呼叫将替换前一个呼叫。您必须拥有某种拖拉机容器,其中包含拖动器的引用,以便窗口上的事件可以解决所有这些问题。或者你也可以替换它(虽然它可能不是最好的表演):
window.onmousemove = dragMove;
window.onmouseup = dragStop;
用这个:
var oldWinMouseMove = window.onmousemove;
var oldWinMouseUp = window.onmouseup;
window.onmousemove = function(e) {
if (typeof oldWinMouseMove === 'function') {
oldWinMouseMove(e);
}
dragMove(e);
};
window.onmouseup = function(e) {
if (typeof oldWinMouseUp === 'function') {
oldWinMouseUp(e);
}
dragStop(e);
};
更好的解决方案
根据要求,这是一个更好的选项,可以避免像上面的解决方案那样创建一个大的调用堆栈: http://jsfiddle.net/bhymxrqr/10/
我们的想法是注册" mousedown"仅限滑块上的事件,以及" mousemove"和" mouseup"仅在窗口上的事件。
// In "Slider":
dragger.onmousedown = dragStart;
// (nothing here about mousemove/up)
在鼠标按下时,存储当前滑块信息(确切地说,存储了mouseup和mousemove回调):
window.activeSlider = {
dragMove: dragMove,
dragStop: dragStop
};
在窗口鼠标移动时,存储的鼠标移动"调用回调;对于鼠标向上,同样删除存储的回调。
///////////////////////////
// Register window global slide handlers
window.onmousemove = function(e) {
if (window.activeSlider !== undefined) {
window.activeSlider.dragMove(e);
}
}
window.onmouseup = function(e) {
if (window.activeSlider !== undefined) {
window.activeSlider.dragStop(e);
}
}
答案 1 :(得分:0)
每次创建一个新的滑块时,你都会覆盖窗口并记录鼠标事件处理程序,所以最后一个有点贪婪,当鼠标离开el并且其他人不在时,可以调用它的功能&# 39;吨。我的建议是不要在窗口或文档上放置处理程序,并在鼠标离开滑块div时调用dragstop
//bind event handlers
dragger.onmousedown = dragStart;
dragger.onmousemove = dragMove;
dragger.onmouseup = dragStop;
holder.onmousemove = dragMove;
holder.onmouseup = dragStop;
line.onmousemove = dragMove;
line.onmouseup = dragStop;
el.onmousemove = dragMove;
el.onmouseup = dragStop;
el.onmouseleave = dragStop;
我也看到了镀铬的dgragger的一些重影,但这可以通过为gragger添加透明轮廓来轻松修复
.slider-dragger {
position: absolute;
width: 26px;
height: 11px;
border-radius: 3px;
background-color: #555;
top: -3px;
left: 0px;
cursor: pointer;
z-index: 10;
outline: 1px solid transparent;
}
的小提琴