2014-10-31 63 views
2

我有我自己開發的JavaScript Slider庫。它運行良好,當我只初始化一個滑塊時,但有一些問題,當有多個Slider初始化時。我自己的JavaScript庫有問題。看不到它在哪裏

正如你可以在這裏看到: http://jsfiddle.net/bingo14/bhymxrqr/6/

最後一個滑塊工程進展順利和完美,但前兩個不,我不能看到問題的所在。如果您在拖動時拖動第一個滑塊並使用光標執行一些圓形運動,滑塊將停止!出於某種原因,最後一次不會發生。

我的事件處理程序可能有問題嗎?

dragger.onmousedown = dragStart; 
dragger.onmousemove = dragMove; 
dragger.onmouseup = dragStop; 

window.onmousemove = dragMove; 
window.onmouseup = dragStop; 
..... 
+1

,我只能看到一個滑塊在撥弄 – Quince 2014-10-31 15:26:15

+0

如果你問我們調試代碼爲你(這是不歡迎太),至少做到這一點右(實際上重現問題的小提琴)。 – 2014-10-31 15:28:53

+0

@Quince - 鏈接已更新!對不起,關於 – ctrlz 2014-10-31 15:36:25

回答

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) 

在按下鼠標,目前的滑信息存儲(準確的說,鼠標鬆開和鼠標移動回調存儲):

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); 
    } 
} 
+0

是的,它的工作原理!哇,非常感謝。我永遠不會弄清楚。但爲了表現上的智慧,我會嘗試嘗試您提出的替代解決方案。 「你有什麼意思的拖拉機容器,持有你的拖動器的引用,以便窗口上的事件可以解決所有的問題」? – ctrlz 2014-10-31 16:03:39

+0

其實我錯了,你不需要把它們都存放在一個容器中。當滑塊被點擊(mousedown)時,將其引用存儲在單個變量(全局類型)中。當窗口收到move或mouseup事件並且定義了這個變量時,調用這個變量的move/mouseup。當然,在mouseup上,刪除這個變量引用。 – Joel 2014-10-31 16:15:19

+0

我嘗試過,但它似乎沒有工作..任何機會,你可以證明與僞代碼或與jsfiddle請嗎? – ctrlz 2014-11-03 17:54:51

0

每次創建要覆蓋窗口和文檔鼠標事件處理新的滑塊,所以最後一個是有點貪心,並得到調用它的功能,當鼠標離開EL和別人不要」噸。我的建議是不要將窗口或文檔上的處理程序,並調用dragstop當鼠標離開滑塊的div

//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; 

我也看到在Chrome中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; 
} 

這裏提琴顯示最終結果http://jsfiddle.net/leighking2/bhymxrqr/9/

+0

是的,我正在考慮類似的東西,但在可用性方面並不理想。如果光標在容器外,用戶應該能夠拖動滑塊,否則,如果你的手不穩定,就會變得有點煩人!雖然謝謝:) – ctrlz 2014-10-31 16:11:35

相關問題