jQuery click事件不会解除绑定

时间:2015-08-05 14:36:03

标签: javascript jquery javascript-events event-handling

我点击按钮时想要打开导航。当导航打开并且用户在导航外部单击时,我希望它关闭。我觉得很容易......

我尝试通过按钮上的点击事件来实现此目的,以打开导航。然后我在触发closeNav-method的文档上添加一个新的click事件。

到目前为止,屁股很好。有用。但我的点击事件堆积起来。每次打开导航时,都会添加一个新的文档点击事件。所以我添加了一个关闭以删除以前添加的点击事件。也尝试使用相同结果的unbind。

我的猜测它与处理程序有关,因为我使用this.closeNav.bind(this)。但我不知道......

有什么想法吗?

headerNavigation.prototype.init = function()
{
    // Add on click event on the button that triggers toggleNavigation
    $(this.navBtn).on('click', this.toggleNavigation.bind(this));
}

headerNavigation.prototype.toggleNavigation = function(e)
{
    e.stopPropagation();
    $(this.nav).slideToggle(200);
    // Add an on click for document that triggers this.closeNav
    $(document).on('click', this.closeNav.bind(this)); 
}

headerNavigation.prototype.closeNav = function(e)
{
    console.log($(document).data('events'));
    $(this.nav).slideUp(200);
    // Now remove the on click event for document so we do not stack up on these
    $(document).off('click', this.closeNav.bind(this)); 
}

1 个答案:

答案 0 :(得分:1)

每次调用时,Bind都会创建新功能。

试试这个:

headerNavigation.prototype.toggleNavigation = function(e)
{
    e.stopPropagation();
    $(this.nav).slideToggle(200);
    // Add an on click for document that triggers this.closeNav
    this._binder = this.closeNav.bind(this);
    $(document).on('click', this._binder); 
}

headerNavigation.prototype.closeNav = function(e)
{
    console.log($(document).data('events'));
    $(this.nav).slideUp(200);
    // Now remove the on click event for document so we do not stack up on these
    $(document).off('click', this._binder); 
}