代码之家  ›  专栏  ›  技术社区  ›  matt b

解决AJAX导致的“此页面上的脚本导致IE运行缓慢”的方法?

  •  4
  • matt b  · 技术社区  · 17 年前

    Ajax 来自 mootools framework

    var xmldata = (function() {
        new Ajax('xmldata.jsp?time='+$time(), {method: 'get', onComplete: dataLoaded, autoCancel: true}).request();
    }).periodical(10000);
    

    (每10秒创建一个 Ajax 对象并调用它的 request() 方法,该方法将调用 dataLoaded()

    如果用户将其浏览器窗口打开到该页面约45-60分钟,则尝试在其他位置导航将导致IE(当然是v7,我相信v6,Firefox或Chrome没有此问题)显示以下弹出窗口:


    此页上的脚本导致Internet Explorer运行缓慢。 如果它继续运行,您的计算机可能会失去响应。

    现在,在我看来,这可能是由于mootools框架中底层脚本的某种泄漏造成的——或者是太多 Ajax.request() 调用正在排队等待调用,或者某些对象没有被正确清理,即使框架中应该有一些垃圾收集功能。

    我在这方面见过 a similar question , someone suggested 使用IBM Page Profiler调试此问题。我尝试过使用页面探查器,但没有太大成功-如果您在页面的初始加载方面遇到问题(分析哪个组件导致了过度的加载延迟),它似乎很有用,但它似乎无法分析页面内运行Javascript的情况 它已完全加载。我在PageProfiler中看到,对xmldata.jsp的异步调用每10秒被请求一次,但是PageProfiler只显示服务器响应正常(大约600毫秒),但没有深入了解父页面的脚本如何使用这些数据。

    in this post 在讨论列表中,有人建议删除注册 unload 侦听器调用垃圾收集方法来解决此问题,但这似乎解决了问题的症状,而不是问题本身。

    2 回复  |  直到 9 年前
        1
  •  4
  •   krosenvold    17 年前

    ie leak detector . 有一个极好的例子 msdn article

    泄漏的一个丰富来源是事件处理程序,您确实需要阅读MSDN文章来理解这一点。这些通常只会造成您的类型的泄漏,因此研究注销任何事件处理程序可能是一个好主意。

    我必须承认,每10秒连续重新加载一个小时听起来相当不错;我不确定你是否应该 预料 (可能有点低,但仍然)。你可能需要调整你的期望,或者至少设定一个目标,在IE的单一版本上运行得更好。

        2
  •  0
  •   Kibbee    17 年前

    首先,你可能想让它运行一个小时来检查是否有泄漏,看看IE内存使用是否显著增加。另一个问题可能是IE有某种内部计数器,用于计算javascript在页面上使用的总时间,如果使用时间超过x秒,则会显示警告。即使每个请求不占用大量CPU,在一个小时的过程中,它也可能占用大量CPU,因此IE可能会检测到这是一个问题。另外,我不熟悉mootools,但您可能希望确保使用异步AJAX调用,以最小化javascript代码中的等待时间。