2013-01-13 137 views
4

我已经实现了使用jQuery UI draggable widget的拖放操作。实现自动滚动后的奇怪可拖动行为

我现在正在执行拖动操作时的自动滚动。我设置它,以便当您开始拖动时,浏览器窗口的顶部和底部会出现灰色叠加层。当您拖动到其中一个叠加层时,浏览器窗口开始自动滚动。

您可以在http://www.softcircuits.com/Client/scrolltest.html上看到我的测试页。通过拖动左侧的一个十字线图标拖动一个项目。

但存在一个问题:如果您滚动到页面底部,然后将项目拖到顶部覆盖图,它将按预期向上滚动。然而,对我而言,我大概在页面的上半部分,可拖动的助手不会更高。我无法一直拖到页面的顶部。

这很可能似乎与Draggable小部件有关。有人能够看到为什么会发生这种情况吗?我在Windows 7上使用谷歌浏览器。

+0

我使用的浏览器(22),它似乎为我工作。当我将拖动的项目保留在顶部灰色区域时,它会滚动整个页面。然后,我必须将鼠标(仍在拖动)向下移动到桌面上。但作品... – Peter

+0

@彼得:谢谢。看起来我的版本是24.0.1312.52米。只是再试一次,这次我拖着一整页的东西都没有,所以拖动的东西不会再上去了。在该点移动鼠标的任何数量都不会使该项目更高。你是从底部一直拖到页面顶部的吗? –

+0

奇数。我拿下了最底部的一个项目,并将光标放在顶部灰色区域。我可以一直向上滚动,但是我失去了正在拖动的项目... – Peter

回答

3

为了能够跨浏览器兼容并避免出现异常行为,我建议您使用全部JQueryUI draggable callbacks

我前几天看到,Chrome的最新版本在使用本地HTML5可拖动事件时遇到了一些非常棘手的问题。

例如,我刚刚检查过您的网页源代码,并且您正在使用$('.drag-handle').on('drag', function(){...}); =>您应该使用drag回调。

我也建议不要使用window作为您的案例中的可滚动容器。您应该创建一个div以包装所有表格内容并将其用作滚动容器。我过去已经完成了这个实现,并且它正在工作。

不要忘记在可拖动窗口小部件创建期间在containment选项中设置封装ID。

如果总是不工作,你也可以尝试覆盖在drag回调助手位置:

//Save the mouse position in global variables 
$(document).mousemove(function(e){ 
    window.mouseXPos = e.pageX; 
    window.mouseYPos = e.pageY; 
}); 

$('[id^="drag-"]').each(function() { 
    $(this).draggable({ 
     opacity: 0.7, 
     cursorAt: { top: 15, left: 50 },   
     scroll: true, 
     stop: function(){}, 
     drag : function(e,ui){    
      //Force the helper position 
      ui.position.left = window.mouseXPos - $(this).draggable('option','cursorAt').left; 
      ui.position.top = window.mouseYPos- $(this).draggable('option','cursorAt').top; 
     }); 
}); 
+0

谢谢,我会解决这个问题。但是,我不相信创建一个可滚动的div是可以接受的。当我认为页面应该自然滚动时,这将使正常的滚动有点不自然。另外,当我转到jQuery Draggable页面上的可滚动演示时,我也发现了古怪的行为。在我看来,这仍然是Draggable小部件的一个问题。 –

+0

另外,我不确定我看到使用回调会有什么不同。我看到了与您对我的其他问题的答案相关的代码以及您如何检查鼠标位置。但我正在采取不同的方法。拖动似乎工作得很好。 (除非我错过了一些东西。) –

+0

当你知道这一点时,我会很乐意检查你的解决方案。保持联系。 – sdespont