当前位置: 首页 > 面试题库 >

如何阻止激烈的Javascript循环冻结浏览器

邓夕
2023-03-14
问题内容

我正在使用Javascript解析具有大约3500个元素的XML文件。我正在使用jQuery“每个”函数,但可以使用任何形式的循环。
问题是循环执行时浏览器冻结了几秒钟。停止冻结浏览器而不减慢代码速度的最佳方法是什么?

$(xmlDoc).find("Object").each(function() {
    //Processing here
});

问题答案:

我会放弃“每个”功能而赞成使用for循环,因为它更快。我还将使用“
setTimeout”添加一些等待,但仅在需要时才如此。您不想每次等待5毫秒,因为处理3500条记录大约需要17.5秒。

下面是一个使用for循环的示例,该循环以5 ms的间隔处理100条记录(您可以对其进行调整),从而产生175 ms的开销。

var xmlElements = $(xmlDoc).find('Object');
var length = xmlElements.length;
var index = 0;
var process = function() {
  for (; index < length; index++) {
    var toProcess = xmlElements[index];
    // Perform xml processing
    if (index + 1 < length && index % 100 == 0) {
        setTimeout(process, 5);
    }
  }
};
process();

我还将对xml处理的不同部分进行基准测试,以查看是否有可能解决的瓶颈。您可以使用firebug的事件探查器在firefox中进行基准测试,并写出如下代码到控制台:

// start benchmark
var t = new Date();
// some xml processing
console.log("Time to process: " + new Date() - t + "ms");

希望这可以帮助。



 类似资料:
  • 通常情况下,您使用selenium来自动化测试用例,在测试用例运行完毕后,浏览器关闭。 然而,我尝试使用selenium webdriver编写特定任务的脚本,例如登录到特定页面,但浏览器在登录后应保持打开状态。 我开发了门户,这样,如果我早上开始工作,我就不必登录所有的后端,我只需要登录一次我的门户,从那里我就可以触发我需要的一切。 我这样做是为了登录到typo3后端(片段): 您可以看到,我在

  • 本文向大家介绍JavaScript Web浏览器中的事件循环,包括了JavaScript Web浏览器中的事件循环的使用技巧和注意事项,需要的朋友参考一下 示例 绝大多数现代JavaScript环境都是根据事件循环工作的。这是计算机编程中的一个常见概念,从本质上讲意味着您的程序不断等待新事物发生,并且当新事物发生时对其做出反应。在主机环境调用到你的程序,在产卵事件循环,然后一个“转”或“嘀”或“任

  • 本文向大家介绍JavaScript阻止浏览器返回按钮的方法,包括了JavaScript阻止浏览器返回按钮的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了JavaScript阻止浏览器返回按钮的方法。分享给大家供大家参考。具体分析如下: 下面的JS代码可以阻止用户点击返回按钮,非常实用,需要的朋友可以收藏一下。 希望本文所述对大家的javascript程序设计有所帮助。

  • 问题内容: 我在这里有一个程序示例。我有3个面板,如果要插入面板,我想让用户停止按上一个按钮,最后一个面板也要停止。如果用户位于面板的开始或面板的末尾,有什么方法喜欢禁用按钮? 抱歉,工作代码不够短。我已经修剪了一些。那是我能做的最短的版本。 问题答案: “如果用户是在面板的开始或面板的末尾,有没有办法喜欢禁用按钮?” 根据如何使用CardLayout和CardLayout API ,没有直接的方

  • 我有一个带有“开始”按钮和进度条的小型GUI测试。期望的行为是: 单击开始 Progressbar振荡5秒 进度条停止 观察到的行为是“开始”按钮冻结5秒钟,然后显示进度条(无振荡)。 以下是我目前的代码: 根据Bryan Oakley提供的信息,我知道我需要使用线程。我试着创建一个线程,但我猜,由于线程是从主线程中开始的,所以没有帮助。 我的想法是将逻辑部分放在一个不同的类中,并从该类中实例化G

  • 问题内容: 我正在做一个游戏,我需要每3秒更新一次JProgressBar。为此,我使用while循环。问题是我的程序由于while循环而冻结(我在其他问题中读过它,它们没有帮助我解决此问题)。我不知道该怎么解决。这是我的代码: 你能帮我吗? 问题答案: 您应该在自己的线程中运行循环: 顺便说一句:如果您没有在方法中使用“ String [] args”,则没有理由在方法中声明它。