在执行所有javascript函数onDomReady/onDomLoaded时避免冻结

在执行所有javascript函数onDomReady/onDomLoaded时避免冻结,javascript,jquery,requirejs,Javascript,Jquery,Requirejs,因此,我想将所有javascript函数迁移到requireJS,并尝试尽可能多地使用ondomready事件。但是: 这将冻结浏览器,因为所有javascript都是同步的。这很糟糕。我的意思是,哇,用户看到浏览器内容的速度快了一点,但要尝试单击某个地方,才意识到浏览器已冻结,必须再次单击。这很糟糕。有办法解决这个问题吗 病人:我这样做很痛 医生:那就别那么做 如果您在dom就绪事件上看到冻结,那么可能您正试图做得太多。执行javascript很快。重新绘制页面很慢 您应该有一个函数来处理需要

因此,我想将所有javascript函数迁移到requireJS,并尝试尽可能多地使用ondomready事件。但是:

这将冻结浏览器,因为所有javascript都是同步的。这很糟糕。我的意思是,哇,用户看到浏览器内容的速度快了一点,但要尝试单击某个地方,才意识到浏览器已冻结,必须再次单击。这很糟糕。有办法解决这个问题吗

病人:我这样做很痛

医生:那就别那么做

如果您在dom就绪事件上看到冻结,那么可能您正试图做得太多。执行javascript很快。重新绘制页面很慢

您应该有一个函数来处理需要进行的更改列表,而不是大量的小事件,每个小事件都会对dom进行更改,并导致页面重新绘制。这是domReady插件在ready事件之前所做的。在ready事件之后,它只是在接收时运行它们,这可能会导致多次重画

我在编写自己的动画库时学会了这一点。我使用单个setInterval()来更改单个属性。当执行四次以上时,动画不再平滑。更好的方法是使用单个间隔来处理需要进行的更改列表

编辑:

不要将domReady用作插件
require([“domReady!”]),
将其用作模块,这样您就可以直接运行初始化代码,然后在以后对dom进行更改

require(["domReady"], function(domReady) {
    var element = document.createElement('table');
    //more setup code
    domReady(function(){
        document.body.appendChild(element);
    });
});

为什么你认为浏览器会因为用requireJS加载JS文件而冻结?@jfriend00我不认为,我知道。重点不是加载javascript文件。我说的是执行javascript函数。既然你在domready事件上抛出了所有东西,如果你做了很多,这将导致这种情况发生。如果你所做的只是一个小屁,然后是的,它不会冻结这里的问题是,如果你有大量耗时的javascript来执行只是为了初始化页面,那么不管你是在onDomReady中还是在那之前一点,还是在那之前或之后一点都做,页面都会很忙,直到完成为止执行完毕。幸运的是,初始化页面通常不会非常耗时(设置事件处理程序等)。将此标记为重复的人-请阅读OP的第一条注释。这不是关于JS加载程序的。