當你寫: 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)
在按下鼠標,目前的滑信息存儲(準確的說,鼠標鬆開和鼠標移動回調存儲):
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);
}
}
,我只能看到一個滑塊在撥弄 – Quince 2014-10-31 15:26:15
如果你問我們調試代碼爲你(這是不歡迎太),至少做到這一點右(實際上重現問題的小提琴)。 – 2014-10-31 15:28:53
@Quince - 鏈接已更新!對不起,關於 – ctrlz 2014-10-31 15:36:25