2012-01-19 91 views
2

我在日历类型的应用程序上使用可拖动和拖放的jQuery UI。jQuery UI可拖动的事件顺序

日历呈现为一个表,每行有七个单元格,每个单元格表示一天。每天分为四个季度,在日历内的另一个表格中表示为单元格。这些内表有n行,其中n取决于每个月的工作数量。

我有可拖动的div代表预订,预订可以消耗任何数量的宿舍,因为你拖动它们时我需要关注目标消耗范围。要做到这一点,我使用了拖动和列如下

over: function (event, ui) { 
     // walk forward and highlight the correct cells 
     //console.log('in'); 
        var numCells = ui.draggable.attr('db:length') * 4; 
     var me = jQuery(this); 
     me.addClass('me'); 
     var cells = jQuery(".inner-table .allowableTarget td"); 
     for (var i = 0; i < cells.length; i++) { 
      if (jQuery(cells[i]).hasClass('me')) { 
       cells.slice(i, i + numCells).addClass('drop-hover'); 
       return; 
      } 
     } 
    }, 
    out: function (event, ui) { 
     // unhighlight the highlighted cells from over... 

     //console.log('out'); 
     var items = jQuery(".inner-table td.drop-hover"); 
     items.removeClass('drop-hover'); 

     var me = jQuery(this); 
     me.removeClass('me'); 

    }, 

这主要工作,只要我拖着从左至右其工作正常。如果我从右向左拖动,它不会。看来,其原因是,取决于我以何种方式将事件以不同的顺序拖动。如果我从右向左拖动,则新单元格将在从旧单元格出来之前触发,除非它是内部表格的第一个单元格,在这种情况下,当我拖动到前一个内部表格的最后一个单元格时,它将起作用。

我的问题是;有没有更好的方法来实现我想要的?或者一种方法来确保我总是在结束之前打出电话?

+0

啊明显的答案给出来的东西移到了......有人开始知道一种让它更有效的方法,它看起来有点迟缓吗? – kmcc049

+0

虽然,这意味着当它们拖到完全不同的地方时,它不会忽略突出显示的行 – kmcc049

回答

3

今天我有同样的问题,我没有注意到你的文章之前的原因(前一个元素),当然这是一个正常的行为。 为了解决我的问题,我简单地将“over”函数放置在setTimeout中,时间为0 ms,因此“over”函数被推入任务队列并在“out”函数之后执行。

菲利普·罗伯茨一个伟大的交谈,了解这种机制:http://vimeo.com/96425312

[编辑] 例:http://jsbin.com/rizuse/1/edit?html,js,output

+0

解决方案的一些示例代码会有所帮助。 –

+0

这个答案对我有帮助,而且它一贯的运作。我包我的 '超过' 函数的内容在: '变种T = setTimeout的(函数(){// 把代码在这里 },0);' 提醒:'this'具有不同的上下文这里,你可能需要做一些类似'var that = this'的事情,并在你的setTimeout函数的主体中使用'that'。如果你的函数没有使用'this',那么你不需要担心。 – Lunster