Javascript jQuery UI可拖出事件顺序

Javascript jQuery UI可拖出事件顺序,javascript,jquery,jquery-ui,Javascript,Jquery,Jquery Ui,我在日历类型的应用程序上使用jqueryui,它具有可拖动和可拖放功能 日历呈现为一个表,每行有七个单元格,每个单元格代表一天。每天分为四个季度,表示为日历中另一个表中的单元格。这些内部表有n行,其中n基于每月的作业数 我有代表预订的可拖动div,预订可以消耗任何数量的季度,因为您正在拖动它们,我需要高亮显示目标消耗范围。为了做到这一点,我使用了如下所示的draggable over: function (event, ui) { // walk forward and high

我在日历类型的应用程序上使用jqueryui,它具有可拖动和可拖放功能

日历呈现为一个表,每行有七个单元格,每个单元格代表一天。每天分为四个季度,表示为日历中另一个表中的单元格。这些内部表有n行,其中n基于每月的作业数

我有代表预订的可拖动div,预订可以消耗任何数量的季度,因为您正在拖动它们,我需要高亮显示目标消耗范围。为了做到这一点,我使用了如下所示的draggable

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');

    },
over:函数(事件、用户界面){
//向前走,突出显示正确的单元格
//console.log('in');
var numCells=ui.draggable.attr('db:length')*4;
var me=jQuery(this);
me.addClass('me');
var cells=jQuery(“.internal table.allowableTarget td”);
对于(变量i=0;i
这基本上是有效的,只要我从左向右拖动它就可以了。如果我从右向左拖动,它不会。原因似乎是,根据我拖动事件的方式,事件会以不同的顺序触发。如果我从右向左拖动,新单元格将在从旧单元格中移出之前触发,除非它是内部表的第一个单元格,在这种情况下,当我拖动到前一个内部表的最后一个单元格时,它将工作


我的问题是,;有没有更好的方法来实现我的目标?或者是一种确保我总是在会议结束前打电话出去的方法?

我今天也有同样的问题,在你发表文章之前我没有注意到原因(之前的内容),当然这是正常的行为。 为了解决我的问题,我只需将“over”函数放在一个0毫秒的setTimeout中,这样“over”函数就会被推入任务队列,并在“out”函数之后执行

菲利普·罗伯茨(Philip Roberts)为理解这一机制所作的精彩演讲:

[编辑]
示例:

啊,显而易见的答案是把这些东西移到一开始。。。有人知道一种提高效率的方法吗?这在ie中似乎有点滞后?不过,这意味着当他们拖动到完全不同的位置时,不会突出显示突出显示的行。您的解决方案的一些示例代码会很有帮助。这个答案对我很有帮助,并且一直有效。我将“over”函数的内容包装在:
var t=setTimeout(函数(){//put code here},0)提醒:
在此处具有不同的上下文,您可能需要执行类似于
var that=this
的操作,并在setTimeout函数体中使用
that
。如果您的函数未使用此
,则无需担心。