0

我设置了相当长的超时时间,888 毫秒。而且我要小心不要让我的鼠标指针停留在多个单元格上。在我将鼠标悬停在表格中间的一个单元格上之后,鼠标确实非常短暂地触摸了其他一些单元格,然后快速将鼠标移过相邻的单元格以超出表格的范围。但是鼠标在那些相邻的单元格上只停留了片刻。

然而,对于鼠标离开桌子时触摸到的每个单元格,我都会收到警报。就好像一旦超时触发,任何触发鼠标悬停事件的单元格都被视为已经悬停了整整 888 毫秒。

以下代码位于 each() 循环中,该循环访问表中的每个单元格:

           cell$.hover(
            function () {
                var el = $(this);
                var delayedFunction = window.setTimeout(function () {
                    $.data(el, 'timerid', null);
                    alert("hovered" + el.attr('id'));
                }, 888);       
                $.data(el, 'timerid', delayedFunction);
            },
            function () {
                var el = $(this);
                var delayedFunction = $.data(el, 'timerid');
                if (delayedFunction != null) {
                    // Kill previously started timer
                    window.clearTimeout(delayedFunction);
                }
            }
         );
4

1 回答 1

0

这是因为这些行在var el = $(this);每次调用时都会返回新的 jQuery 对象,因此您要存储delayedFunction的 jQuery 对象在两个函数中都不相同(每次调用任何一个函数时它们都会不同,尽管它们持有相同的 DOM object) 所以你总是进入undefined第二个函数。

您可以通过为实际的 DOM 对象建立超时 ID 来取消此操作,以便保留数据,如下所示:

$.data(el[0], 'timerid', delayedFunction);//In your first function

var delayedFunction = $.data(el[0], 'timerid');//In your second function
于 2013-09-12T18:53:45.980 回答