JqueryUI,将元素拖动到包含大表的滚动可拖放div的单元格中

JqueryUI,将元素拖动到包含大表的滚动可拖放div的单元格中,jquery,jquery-ui,jquery-ui-draggable,Jquery,Jquery Ui,Jquery Ui Draggable,我面临一个拖放问题 我希望始终看到正在拖动的元素,并且我希望能够滚动特定的div以将该元素拖放到表的任何单元格中。我还希望能够将元素从任何div拖动到任何div 这个例子几乎可以很好地工作。我的最后一个问题是关于cellhoverClass属性:当我从“container A”中拖动一个元素到“container B”的边界附近时,我实现了一个自动滚动行为来在表中导航以到达任何单元格。但是,在滚动模拟之后,hoverClass不会应用于正确的单元格。但是,元素总是被放入正确的单元格中 我的方法

我面临一个拖放问题

我希望始终看到正在拖动的元素,并且我希望能够滚动特定的div以将该元素拖放到表的任何单元格中。我还希望能够将元素从任何div拖动到任何div

这个例子几乎可以很好地工作。我的最后一个问题是关于cell
hoverClass
属性:当我从“container A”中拖动一个元素到“container B”的边界附近时,我实现了一个自动滚动行为来在表中导航以到达任何单元格。但是,在滚动模拟之后,
hoverClass
不会应用于正确的单元格。但是,元素总是被放入正确的单元格中

我的方法正确吗

编辑

我找到了一个解决办法。其思想是在helper构造回调期间将元素克隆附加到可滚动容器中,然后在1ms后使用setTimeout函数将helper附加到主体中。辅助对象位置必须映射到鼠标位置,以避免偏移问题

以下是我的最终解决方案:


我确信有可能找到一种最好的方法来实现这一点。

如果我没有正确理解,在您滚动之后,highlitedcells不是正确的方法

在我看来,它计算要从容器元素高亮显示的单元格,然后在table元素内复制de-position

基本上,它检查鼠标从“container2”的偏移量,然后从表“t”位置的偏移量处升高单元格

抓住机会,使用位置而不是偏移。并在,

.offset()方法允许我们检索 相对于文档的元素。将此与.position()进行对比, 它检索相对于偏移父对象的当前位置


Personnaly我只需将css类应用于单元格并使用css:hover/编辑:如果需要这样做的唯一原因是高亮显示单元格。。也许你也想触发一些其他东西。

显然,我的更新是唯一的解决方案

它现在可以正常工作几个月了

我找到了一个解决办法。其思想是在helper构造回调期间将元素克隆附加到可滚动容器中,然后在1ms后使用setTimeout函数将helper附加到主体中。辅助对象位置必须映射到鼠标位置,以避免偏移问题

以下是我的解决方案:

$('[id^=“drag-”])。每个(函数(){
$(此)。可拖动({
不透明度:0.7,
光标:{顶部:15,左侧:50},
附于:'正文',
遏制:"身体",,
卷轴:没错,
助手:函数(){
//黑客将墨盒附加到机身上(在其他div上方可见),
//但仍然是滚动的容器
$('#container').append('+$(this.html()+'');
$(“#克隆”).hide();
setTimeout(函数(){
$('克隆').appendTo('正文');
$(“#克隆”).show();
},1);
返回$(“#克隆”);
}    
});
});​

三年后仍然是最好的解决方案!但5年后就不行了。即使在这种情况下,滚动后也会突出显示错误的单元格。我整天都在试图解决那个问题,但没有多大成功。
$('[id^="drag-"]').each(function() {
    $(this).draggable({
        opacity: 0.7,
        cursorAt: { top: 15, left: 50 },
        appendTo: 'body',
        containment: 'body',        
        scroll: true,
        helper: function(){ 
            //Hack to append the cartridge to the body (visible above others divs), 
            //but still bellonging to the scrollable container  
            $('#container').append('<div id="clone" class="cartridge">' + $(this).html() + '</div>');   
            $("#clone").hide();
            setTimeout(function(){
                $('#clone').appendTo('body'); 
                $("#clone").show();
            },1);
            return $("#clone");
        }    
    });
});​