Javascript js/jQuery拖放';n';Drop,重新计算Drop目标

Javascript js/jQuery拖放';n';Drop,重新计算Drop目标,javascript,jquery,tree,Javascript,Jquery,Tree,我有以下问题,我有一个大的树,它有子节点,可以根据需要折叠和展开(节点内的数据通过AJAX获取)。但是,我使用jquery.event.drop/drag来创建拖放目标 但是,当我折叠/展开放置目标时,会改变位置,需要重新计算。我想这样做: function create_drop_targets() { $('li a') .bind('dropstart', function(event) { }) .bind('drop', function(event) {

我有以下问题,我有一个大的树,它有子节点,可以根据需要折叠和展开(节点内的数据通过AJAX获取)。但是,我使用jquery.event.drop/drag来创建拖放目标

但是,当我折叠/展开放置目标时,会改变位置,需要重新计算。我想这样做:

function create_drop_targets() {
  $('li a')
    .bind('dropstart', function(event) {
    })
    .bind('drop', function(event) {
    })
    .bind('dropend', function(event) {
    });
}
折叠/展开时调用create_drop_targets()

然而,这不起作用。我在jquery.event.drop中找到了以下内容:

var drop = $.event.special.drop = {
    setup: function(){
        drop.$elements = drop.$elements.add( this );
        drop.data[ drop.data.length ] = drop.locate( this );
        },
    locate: function( elem ){ // return { L:left, R:right, T:top, B:bottom, H:height, W:width }
        var $el = $(elem), pos = $el.offset(), h = $el.outerHeight(), w = $el.outerWidth();
        return { elem: elem, L: pos.left, R: pos.left+w, T: pos.top, B: pos.top+h, W: w, H: h };
        }

现在,我需要知道如何再次调用setup()方法,以便它使用可拖放项的新位置重新填充$elements。

也许最好添加jQuery 1.3中引入的实时事件


$(“LIA”).live(“dropstart”,function(){…})

也有同样的问题。我在jQuery的源代码中漫游,发现了以下内容(在
ui.droppable.js
):

所以,你只需要使用

$(".cocktails").draggable({
  refreshPositions: true,
});

似乎没有太多的记录。。。但它解决了我的问题。当然,我会建议一些依赖于使用情况的调整(在更改发生之前启用它,并在用户移动鼠标并发生更改后禁用它)。

当我尝试在liteGrid中将滚动与可拖动行相结合时,我遇到了相同的问题,但我找到了解决方法。您的里程数可能会有所不同,但我所做的是将逻辑添加到我的拖动事件处理程序中,该处理程序将检查网格是否正在滚动(此时我需要强制刷新可拖放位置),如果是,我将可拖放位置设置为true。这不会立即刷新位置,但会导致它们在下次拖动控制柄移动时刷新。因为刷新位置会减慢速度,所以我会在下次拖动事件处理程序启动时重新禁用它。最终的结果是,只有当网格在liteGrid中滚动时,才会启用refreshPositions,其余时间则禁用它。下面是一些代码来说明:

//This will be called every time the user moves the draggable helper.
function onDrag(event, ui) {
    //We need to re-aquire the drag handle; we don't
    //hardcode it to a selector, so this event can be
    //used by multiple draggables.
    var dragHandle = $(event.target);

    //If refreshOptions *was* true, jQueryUI has already refreshed the droppables,
    //so we can now switch this option back off.
    if (dragHandle.draggable('option', 'refreshPositions')) {
        dragHandle.draggable('option', 'refreshPositions', false)
    }

    //Your other drag handling code

    if (/* logic to determine if your droppables need to be refreshed */) {
                dragHandle.draggable('option', 'refreshPositions', true);
    }
}


$("#mydraggable").draggable({
    //Your options here, note that refreshPositions is off.
    drag: onDrag
});

我希望这可以避免你像我一样多次把头撞到键盘上……

我意识到原来的问题现在已经很老了,但是我想出了一个小技巧来刷新可拖动元素的位置,而不会产生太多开销(AFAICT),那就是在适当的情况下禁用并立即重新启用它们

例如,我注意到调整浏览器窗口的大小不会刷新可拖动表格行的位置,因此我这样做:

$(window).resize(function () {                
    $(".draggable").draggable("option", "disabled", true);
    $(".draggable").draggable("option", "disabled", false);
});

我希望这能帮助别人

我已经在1.3.2版的live events上尝试过了,没有解决方案。我明天就要尝试,我会随时通知你的!我应该注意到,我只是尝试启用刷新位置,但性能不可接受。使用此解决方案,当拖动行导致网格滚动时,我的性能仍然很慢,但其余时间它的性能很好(因为refreshPositions被禁用)。我会在有时间的时候尝试:-)
$(window).resize(function () {                
    $(".draggable").draggable("option", "disabled", true);
    $(".draggable").draggable("option", "disabled", false);
});