2012-07-23 84 views
20

我有一个我想要绑定拖放事件的页面。我希望浏览器中的整个页面成为放置目标,因此我将事件绑定到document对象。但是,我的应用程序的内容通过AJAX加载到主要内容区域,并且我只希望在上载页面当前可见时这些事件处理程序处于活动状态。只有在事件处理程序尚不存在的情况下,如何绑定事件处理程序?

现在,我在检索上传页面时绑定事件处理程序;但是,每当上传页面变为活动状态时,它会绑定一个新的事件处理程序,这会导致处理程序在用户转到上载页面,离开并返回时多次触发。我想我可以解决这个问题,如果我可以让处理程序绑定,只有当它尚未绑定。这是可能的,还是我忽略了一个更好的选择?

相关的代码,如果它可以帮助:你绑定新的

$(document).bind('dragenter', function(e) { 
    e.stopPropagation(); 
    e.preventDefault(); 
}).bind('dragover', function(e) { 
    e.stopPropagation(); 
    e.preventDefault(); 
}).bind('drop', function(e) { 
    e.stopPropagation(); 
    e.preventDefault(); 
    self._handleFileSelections(e.originalEvent.dataTransfer.files); 
}); 
+0

的[jQuery的,如果元素上存在检查事件]可能重复(http://stackoverflow.com/questions/1515069/jquery-check-if-event-exists-on-元素) – dgw 2012-07-23 14:37:05

回答

27

拆散现有的事件处理程序之前。这实在是简单与namespaced events [docs]

$(document) 
    .off('.upload') // remove all events in namespace upload 
    .on({ 
     'dragenter.upload': function(e) { 
      e.stopPropagation(); 
      e.preventDefault(); 
     }, 
     'dragover.upload': function(e) { 
      e.stopPropagation(); 
      e.preventDefault(); 
     }, 
     // ... 
    }); 
+2

我不得不使用'bind()'和'unbind()'而不是'on()'和'off()',但是这种方法运行良好。谢谢! – FtDRbwLXw6 2012-07-23 13:33:22

+0

是的,如果你坚持使用旧版本的jQuery(传递一个对象到'bind'也应该可以)。命名空间事件已经在jQuery 1.2中引入,所以绝对应该工作:)快乐编码! – 2012-07-23 13:35:03