【问题标题】:Should events that are no longer needed be unbound?不再需要的事件是否应该解除绑定?
【发布时间】:2017-01-10 08:11:49
【问题描述】:

我的网页中有导航。单击按钮时会显示导航。然后,当用户单击导航之外的任何位置时,我会关闭导航。

$("#navbutton").click(function(){
     if($("#navigation:visible"))
       $('#navigation').hide();
     else {
       $('#navigation').show();
     }
});

$(document).click(function(event) { 
    if(!$(event.target).closest('#navigation').length) {        
            $('#navigation').hide();        
    }        
})

现在,即使导航已经隐藏,document 上的点击事件也会继续触发。我在文档上也有许多其他点击事件。

我的问题是当导航已经隐藏时删除文档上的点击事件有什么好处吗?是否会释放一些浏览器内存?我的网页会表现得更快吗?我知道对于一个事件的影响会很小。但是,假设我有 100 多个类似的导航。删除 100 个这些不必要的事件是否有益?

谢谢

【问题讨论】:

    标签: javascript jquery html dom-events


    【解决方案1】:

    getify 看了标题《你不知道的 JS:异步与性能》后,非常明确地表示,未成熟的优化是万恶之源。

    你可以直接跳到他那本书的chapter

    如果这是一个简单的网页,并且有适量的 DOM 对象,那么在内存中始终拥有事件侦听器不会造成任何损害,并且如果经过优化,则不会提供太多性能。

    在进行优化之前,您必须进行一些基准测试,并且您必须了解您的基准测试是什么,并且与现实世界相比,这些基准测试结果意味着什么?

    【讨论】:

    • 删除scrollwindow.resize事件会有什么好处吗?
    • @user31782 这也取决于,但通常是的。滚动和调整大小比其他事件更频繁地触发,所以如果你有任何重物,而不是删除它们。还有一种限制调整大小和滚动的做法。
    • 你的意思是这个节流事件css-tricks.com/the-difference-between-throttling-and-debouncing他们每100ms后执行一次scrll事件吗?我们可以像他们那样在 jquery 中添加 100ms 的事件吗?
    • @user31782 是的,类似的东西
    【解决方案2】:

    如果您删除元素而不是隐藏它,如果您将来不需要它,浏览器现在会自行删除这些事件处理程序,这是消除内存泄漏的方法之一。 最近我浏览了这个博客:

    http://javascript.crockford.com/memory/leak.html

    这是一个非常有用的博客。

    【讨论】:

    • 删除scrollwindow.resize事件会有什么好处吗?
    【解决方案3】:

    是否停止和事件不会对性能产生任何影响,实际上它只是不会被用户注意到。

    如果您希望您的页面在 IE6 或更旧的浏览器上运行得一样快,这将很有帮助。但是对于比这更现代的浏览器,您将无法获得更多。

    您可以查看这篇非常有用的文章:The Dangers of Stopping Event Propagation

    【讨论】:

    • 删除scrollwindow.resize事件会有什么好处吗?
    猜你喜欢
    • 2014-04-05
    • 1970-01-01
    • 1970-01-01
    • 2012-07-04
    • 2011-02-24
    • 2018-01-04
    • 2020-03-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多