2011-03-08 90 views
0

有什么办法可以暂停mousemove事件直到任务完成?有任何方法可以在任务完成之前暂停'mousemove'事件吗?

$(document).bind('mousemove', function (e) 
{ 
    // mousemove: please wait and stop moving 
    document.removeEventListener('mousemove'); 

    // I am the task 
    $.ajax({ 
     url: '/getData', 
     type: 'POST', 
     success: function (result){} 
    }) 
    .done(function() 
    { 
     // I am done, start moving... 
     document.addEventListener('mousemove'); 
    }); 
}); 

我想要什么:

  • 鼠标移动触发的事件,并停止为 一旦被解雇。

  • 它内部的函数执行。

  • 完成后执行的函数, MouseMove事件再次开始射击

  • 这样做是暂停鼠标 移动事件,直到任务完成或 失败。

+0

'.bind()'是一个不推荐使用的函数。尝试使用'.on()'(假设您使用的是jQuery 1.7+) – Martin 2013-06-21 19:39:43

回答

2

首先,为什么混合原始DOM /事件访问与jQuery?不要这样做。

要实现你想要的简单功能,请使用非匿名函数并使用$(document).one('mousemove', yourFunction);来绑定它 - 无论是在外部还是在done()函数中。

function handleMouseMove(e) 
{ 
    // I am the task 
    $.ajax({ 
     url: '/getData', 
     type: 'POST', 
     success: function (result){} 
    }) 
    .done(function() { 
     $(document).one('mousemove', handleMouseMove); 
    }); 
} 

$(document).one('mousemove', handleMouseMove); 
+1

+1,非常好的答案,这对我非常有用。 – kobe 2011-05-20 01:17:16

0

使用标志禁用/启用这样的:

$(document).data('enableMyMouseMove',true).bind('mousemove',function (e) { 

    if($(document).data('enableMyMouseMove')) { 
     $(document).data('enableMyMouseMove',false); 
     $.ajax({ 
     url: '/getData', 
     type: 'POST', 
     success: function (result) {}, 
     complete: function(){ $(document).data('enableMyMouseMove',true); } 
     }); 
    } 
}); 

注意,我已经动了你的“完成”功能进入complete事件处理程序上Ajax调用,因为海事组织,那就是清洁,但是如果你愿意,逻辑是相同的,你可以保持完成功能。

尽量避免绑定/解除绑定事件处理程序,因为除非您知道自己在做什么,尤其是在ie中,否则它是创建memleaks的一种非常简单的方法。

其原因是,即为js和DOM对象分别存储垃圾回收,如果两者之间存在循环引用,则不会发生垃圾回收。当绑定eventHandlers时,创建js和DOM之间的循环依赖性非常容易

2

如果您的任务时间很短。 您可以使用bool标志锁定mousemove功能。 虽然这会调用mousemove上的函数,但在您释放锁之前不做任何事情返回 。

var moveFlag = true; 

$(document).bind('mousemove', function (e) 
{ 
    if(moveFlag == false) 
     return; 

    moveFlag = false; 

    // I am the task 
    $.ajax({ 
     url: '/getData', 
     type: 'POST', 
     success: function (result){} 
    }) 
    .done(function() 
    { 
     // I am done, start moving... 
     moveFlag = true; 
    }); 
}); 
相关问题