我正在尝试智能地取消绑定jquery中的事件,以便我可以轻松地启用/取消它们。我试图避免使用状态变量,因为它不应该是必要的,它使我的共享函数非常混乱。这是我最初尝试过的不起作用的地方。
var dragStart = $('#ruler').mousedown(function(e){
position = container.offset();
mousePosition = {
x: e.pageX,
y: e.pageY
};
var dragging = $(document).mousemove(function(e){
var x = e.pageX - mousePosition.x;
var y = e.pageY - mousePosition.y;
container.offset({
left: position.left + x,
top: position.top + y
});
});
var dragStop = $(document).mouseup(function(){
dragStart.unbind();
dragging.unbind();
dragStop.unbind();
});
});
我发现这不起作用,因为jQuery的事件处理函数返回对选择器中元素的引用,因此所有内容都从$(document)解除绑定,这在我的环境中是一个问题。
我知道我可以提出函数名称并进行有针对性的解绑,但是我必须做的所有不同的函数(不仅仅是显示),这将使代码变得痛苦。有没有什么方法可以让我的功能类似于我在上面的代码中的功能?我正在思考这个问题:
var foo;
$(<selector>).<eventType>(foo = function(){
// DO SOMETHING
$(<unbind button>).click(function(){
// foo.unbind();
// OR
// $(<selector>).unbind(foo);
// ???????
});
});
我甚至会对创造性的解决方案持开放态度。我现在可以让它正常工作,但我正试图看看我能否以这种特殊方式做到这一点。谢谢!
答案 0 :(得分:2)
你应该namespace以一种让你对它们有更多权力的方式发生事件,所以如果说,你有一个委派事件click
的王者一直上升到{{1}像这样:
document
并且你可能有更多这样的东西,它被一直委托给身体,所以如果你想要删除其中一个,当你从$(document).on('click','a', doSomething);
事件中取消click
事件时,你实际上会杀死所有其他事件。文档。
更好的是:
$(document).on('click.someName','a', doSomething); // bind
$(document).off('click.someName','a'); // unbind
想象一下,页面上可能还有更多的代码可能会使用事件委托一直到文档,t或其他一些元素,所以没有命名空间,绑定/解除绑定事件时会出现串通