2009-11-05 58 views
1

我只加载一个JS文件只需要我的网页的一部分,只有当用户导航到页面上的该选项卡。错误处理在动态JS加载

var scriptFile = document.createElement("script"); 
scriptFile.setAttribute("type", "text/javascript"); 
scriptFile.setAttribute("src", scriptURL); 

我想拿出一个错误处理机制,该动态加载,这样我就可以显示错误消息,如果JS负载超时或者如果JS是由URL指定的位置不可用。

这就是我想实现的错误处理(用于IE):

scriptFile.onreadystatechange = function() { // For IE 
    if (this.readyState == 'complete' || this.readyState == 'loaded') { 
     // Display content in tab 
    } else { 
     // Display error message 
    } 
} 

这导致一个问题。当一切正常,并且JS按预期方式出现时,我先收到错误消息,然后收到正确的内容。

经过一番头脑风暴之后,我发现readyState先从“未初始化”变为“加载”,然后再变为“已加载”。它在状态处于“加载”状态时显示错误消息。之后,状态正在改变为“正在加载”内容正在被显示。

任何想法如何处理这个错误最初不显示?

+0

更新: 我需要即使显示错误信息JS不在所给的URL处。 即使在JS出现404错误的情况下,状态也会“完成”,并且页面正在尝试显示数据..显示JS错误。 我该如何处理? – 2009-11-05 11:35:03

回答

3

由于没有“哎呀,我死了!”状态,您不能显示错误消息。

编辑:删除的代码,因为我的观点是,你不能这样做。通过AJAX请求,您可以检查响应并查看它是否是404,但您无法通过脚本标记执行此操作。

EDIT2:关于第二个想法,你为什么不通过AJAX获取脚本并注入 '<脚本类型= “文/ JavaScript的” >' + responseText的+ '< /脚本>' 里面document.body的?

要检查AJAX请求是否已被轰炸,请检查XMLHTTPRequest对象的状态属性。如果它是404,那么这是一个404.

此外,你不应该手工做这个东西。我总是建议使用Prototype或jQuery。由于我被Prototype宠坏了,我不应该试图解释如何检查请求的状态。你为什么不问在这里的另一个问题如何处理AJAX请求?该专业人士肯定会告诉你如何处理各种故障,而不仅仅是404

+1

呵呵..我的练习的重点是显示错误信息。 :) – 2009-11-05 11:30:58

+0

我知道,但你不知道脚本是否失败。至少我的版本在第一次更改状态后不会放弃。 – 2009-11-05 11:34:01

+0

请检查我的更新..我需要处理JS根本不加载的情况(HTTP 404)。 – 2009-11-05 11:38:24

1

如何让一个(全局)变量检查它是否被加载(例如,脚本将在加载完成后设置它),然后使用定时器设置另一个函数(已经在加载函数的页面上)来检查变量(如5秒延迟?)

如果未设置变量(在预定义的时间量之后),则向用户显示错误。

+0

嗯..听起来不错。我会试一试。 – 2009-11-05 11:27:34

+0

但这意味着您只允许5秒加载脚本;一旦他们通过了,如果它仍在播放,你仍然会显示错误信息。如果用户的调制解调器由于大量的色情内容或者大量的lolcats请求而大量加载? – 2009-11-05 11:31:35

+0

你可以把它做成10,不管:-) – dusoft 2009-11-05 11:36:06

1

我认为你需要放弃“else”,因为它总是会经历这个“加载”状态,无论它是否工作,所以“else”分支没有做任何有用的事情。

而是设置一个超时。

var scriptTimer = setTimeout(function() { 
    // show error message 
    // (should ideally precede with a check the content hasn't 
    // been displayed, in case of race condition) 
}); 
scriptFile.onreadystatechange = function() { // For IE 
    if (this.readyState == 'complete' || this.readyState == 'loaded') { 
     clearTimeout(scriptTimer); 
     // now display content in tab 
    } 
} 
+0

即使在超时后脚本无法加载,会发生什么情况? 我该如何处理? – 2009-11-05 11:29:57

+0

你已经显示了错误信息;没有别的办法可以处理。如果你愿意,你可以再试几次,也就是说,从一个计数器“var scriptAttempts = 3”开始,然后尝试从setTimeout处理程序重新加载脚本。每次运行加载scrpt的函数时,它都会检查scriptAttempts是否大于0,并且递减scriptAttempts,直到放弃并显示错误消息。如果你这样做的话,我也会展示一个进度指标,因为延迟可能会很长。 – mahemoff 2009-11-05 13:40:54

0

编辑:我的方法是错误的 - 使用AJAX作为风建议

+0

如果它不是“完整”或“加载”,它怎么可能不是“加载”? – 2009-11-05 11:28:16

+0

由于他在else部分中显示错误消息,我认为他会寻找一些'错误'状态 - 使用Google搜索并发现它不起作用。通过AJAX加载并检查404是我想要的方式。 – Amarghosh 2009-11-05 11:49:09