Modernizr.load回调执行之前加载脚本(Modernizr.load callback e

2019-10-18 21:57发布

在我的javascript中的某一点我已在(使用Modernizr的2.6.2)以下内容:

Modernizr.load([{
    load: '/path/file.js',
    complete: function () {
        //do stuff
    }
}]);

它的伟大工程的大部分时间,除了在IE8,开出3约1时首先执行的回调,然后加载脚本。 我的回调和其他内部file.js.添加一个破发点 这两个脚本正在执行,只是在交换倍的量级。

我试图孤立和重现错误,但我不能。 当我的页面(使用完全相同的Modernizr的文件)中只有这个代码它的工作原理,每次罚款。 出于这个原因,我相信其他人对我的项目的东西可以干扰,但我有什么沿10000下一个看起来毫无头绪(真的!)JS的线。 任何人都经历类似的话或有什么可能会导致这种行为的任何想法?

我不想替此特定情况下的解决方法。 这是许多情况下,我真的想保持原样之一。

编辑1 -新信息:使用网络面板,我可以看到有两个请求被完成( 预计 ),但在第一次请求总是返回空白。 第二个请求带来了正确的内容。 当两个请求完成后执行回调,但有时回调第一(空)和第二个请求之间执行的正常工作。 这是当它崩溃!

编辑2 -最新资讯:好吧好像现在我可以复制它。 是100%确定我的假设我必须知道在深的JavaScript引擎,这是我没有,所以我可能是完全错误的,但这里是我发现:

请求file1.js和file2.js。 如果文件2完成加载,而发动机是忙于执行文件1的回调,文件2执行去某处的队列,文件2的回调之后,这意味着结束。

Answer 1:

尝试等待所有文件的射击回调之前加载。 展开上的图案下方,以满足您的需求。

Modernizr.load([{

load: '/path/file.js',
complete: function () {
    filesLoaded++;
    checkStatus();
}
}]);

function checkStatus(){
  if(filesLoaded == 2){
    //do stuff
  }else{
    setTimeout(checkStatus, 100);
  }
}


Answer 2:

关于这个问题做了一些研究之后,我想这个问题可能是更常见的似乎比在第一,但一直被忽视,因为它是上下文相关的,并具有所描述的不同的方法:

Modernizr的负载[A,B]似乎之前执行B,这怎么可能?

YepNopeJS:回调之前的小JS文件触发满载

https://github.com/SlexAxton/yepnope.js/issues/195


看完这个漂亮的文章 (yepnope页面上引用),大约经历了IE浏览器的不一致,我想出了一个解决方法,这已发送通过从github上yepnope维护者:

http://github.com/SlexAxton/yepnope.js/pull/196

我不知道它是否会被接受与否,但它解决了我的问题。


作为编辑库可能并不总是一个好主意,我会建议采取以下解决办法:

//instead of
complete:function(){
    doStuff()
}
//try
complete:function(){
    setTimeout(doStuff, 0);
}


文章来源: Modernizr.load callback executing before loaded script