【问题标题】:Unbind Events in ASP UpdatePanel BEFORE Ajax Request to prevent Memory Leak在 Ajax 请求之前取消绑定 ASP UpdatePanel 中的事件以防止内存泄漏
【发布时间】:2013-04-01 13:54:32
【问题描述】:

在 ajax 请求后需要重新初始化 ASP UpdatePanel 中的 jQuery 小部件是一个常见问题,但是我的问题是在替换 UpdatePanel 中的 HTML 之前事件没有解除绑定。每当您调用 .html("...") 或 .remove() 时,jQuery 都会为您解决这个问题,但 UpdatePanel 不使用 jQuery。

我有弹出元素(在 UpdatePanel 内部),当用户在它们外部单击时需要隐藏这些元素,因此我制作了一个 jQuery 特殊事件来检测何时发生这种情况,但是在 Ajax 请求之后永远不会调用 Teardown 函数。因此,随着时间的推移,不再附加到文档的元素上的事件处理程序越来越多。

我可以让我的小部件初始化函数(在每个 Ajax 请求之后运行),检查分离的元素并取消绑定它们的事件,但我担心这可能会导致其他问题。

【问题讨论】:

    标签: jquery asp.net updatepanel unbind teardown


    【解决方案1】:

    虽然我用之前的回答解决了这个问题,但这篇关于代码项目的文章可能会对其他有类似问题的人有所帮助: http://www.codeproject.com/Articles/34348/jQuery-Memory-Leak-in-UpdatePanel

    首先它建议使用在页面加载和 ASP Ajax 请求之后运行的Sys.Application.add_load,尽管它不会解决您的内存泄漏问题。

    其次,注意如何通过 javascript 闭包绑定事件。但是,这可能无法完全解决 UpdatePanel 的特定问题。

    第三,您可以向 HTML 元素添加dispose 函数,该函数在 ASP 使用 ajax 请求销毁 HTML 时执行。 dispose 函数应该取消绑定事件处理程序,任何删除对该元素的任何其他引用。这应该是 ASP UpdatePanel 内存泄漏的最后一根钉子。

    【讨论】:

      【解决方案2】:

      似乎有一个简单的解决方案,就是在弹出窗口显示时绑定“clickout”事件,在弹出窗口隐藏时解除绑定。由于 ajax 请求,这仍然可能导致单个事件不会被解除绑定,但这是可以容忍的。

      【讨论】:

        猜你喜欢
        • 2013-02-07
        • 2010-09-21
        • 1970-01-01
        • 1970-01-01
        • 2012-04-24
        • 1970-01-01
        • 2010-11-30
        • 2016-07-10
        • 2011-12-05
        相关资源
        最近更新 更多