2013-11-05 49 views
1

之前在某一点上我的javascript我见(使用Modernizr的2.6.2)以下内容:Modernizr.load回调执行已加载脚本

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

它的伟大工程的大部分时间,除了在IE8,约3次中的1次,它首先执行回调,然后加载脚本。我在回调中添加了一个断点,另一个在file.js中添加了一个断点。这两个脚本正在执行,只是有时交换订单。

我试图分离和重现错误,但我不能。当我在页面上只有这个代码时(每次使用完全相同的Modernizr文件),它都可以正常工作。出于这个原因,我相信我项目上的其他东西可能会干扰,但我不知道沿着js的10000(真的!有没有人遇到过类似的事情,或者对可能导致此类行为的事情有所了解?

我不想为这个特定情况寻找解决方法。这是我真正想保持原样的许多情况之一。

编辑1 - 最新资讯: 使用网络面板,我可以看到有两个请求被做(which is expected),但在第一次请求总是返回空白。第二个请求会显示正确的内容。在两个请求完成后执行回调时,这种方式正常工作,但有时会在第一个(空)和第二个请求之间执行回调。那是当它崩溃!

编辑2 - 新信息:好吧,好像我现在可以重现它。为了100%确定我的假设,我必须知道深层的JavaScript引擎,我不知道,所以我可能会错误的,但这里是我发现的:

请求file1.js和file2。 JS。如果file2在引擎忙于执行file1的回调时完成加载,则file2执行会在队列末尾的某处进行,这意味着在file2的回调之后。

+0

“10000(!真的)JS行”你疯了吗?谁会开发这个?谁来运行?我正在考虑https://www.healthcare.gov – bjb568

+0

五个前端开发人员会在11个月内开发它=) –

+0

这并不能解释谁来运行它。即使服务器不得不向浏览器的脸部扔出10000行馅饼,它也会窒息。 – bjb568

回答

2

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

Modernizr load [A, B] seems to execute B before A, how is this possible?

YepNopeJS: callback triggered before tiny JS file is fully loaded

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


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

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

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


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

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

尝试在触发回调之前等待所有文件加载。展开下面的模式以满足您的需求。

Modernizr.load([{ 

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

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

嘿,谢谢你的回答。这可能会奏效,但正如我所说的,我并不是真的在寻找解决方法,而是找到问题的根源。 –

+1

@HugoSilva问题的根源在于IE本身:) – sakhunzai