我正在使用 javascript 来包含从另一台服务器上的 php 文件提供的一些内容。然而,这个其他服务有时会变得不稳定,要么需要很长时间才能加载,要么根本不会加载。
JS中有没有办法在失败并显示“请重试”消息之前尝试在x秒内获取外部数据?
<script type="text/javascript" src="htp://otherserver.com/myscript.php"></script>
我正在使用 javascript 来包含从另一台服务器上的 php 文件提供的一些内容。然而,这个其他服务有时会变得不稳定,要么需要很长时间才能加载,要么根本不会加载。
JS中有没有办法在失败并显示“请重试”消息之前尝试在x秒内获取外部数据?
<script type="text/javascript" src="htp://otherserver.com/myscript.php"></script>
几个问题:您可以将超时阈值与XMLHttpRequest
(又名 ajax)一起使用,但是由于同一来源策略限制otherserver.com
,您无法使用XMLHttpRequest
(并且支持所有 A 级浏览器)。
如果脚本引入了任何类型的全局名称(例如任何变量名称、函数名称等),您可以尝试setTimeout
继续检查它:
var TIMELIMIT = 5; // seconds until timeout
var start = new Date;
setTimeout(function() {
// check for something introduced by your external script.
// A variable, namespace or function name here is adequate:
var scriptIncluded = 'otherServerVariable' in window;
if(!scriptIncluded) {
if ((new Date - start) / 1000 >= TIMELIMIT) {
// timed out
alert("Please try again")
}
else {
// keep waiting...
setTimeout(arguments.callee, 100)
}
}
}, 100)
我看到的问题是您无法取消对脚本的请求。如果我错了,请有人纠正我,但从<script>
DOM 中删除仍然会使浏览器对资源的请求处于活动状态。因此,尽管您可以检测到脚本加载时间超过 x 秒,但您无法取消请求。
我想你可能不走运。
我能想到的唯一方法是在另一个(启用 PHP)的服务器上创建一个代理,它将为您获取数据,但在达到某个超时限制时会停止(并且它可以只返回一个空结果)。
这纯粹是纯粹的理论:
<script>
标签可以动态插入到 DOM 中,此时将获取并处理脚本。这种动态脚本标签注入是如何实现跨域“AJAX”的。
我想你可以声明一个全局变量var hasLoaded = false;
。在您尝试加载的脚本结束时,您可以将该变量设置为 true hadLoaded=true;
。将脚本标签注入 DOM 后,您可以启动 setTimeout(),其回调函数检查“hasLoaded”是否设置为 true。如果不是,您可以假设脚本尚未完全加载到浏览器中。如果有,您可以假设它已完全加载。
同样,这是理论上的,但如果你测试它一定要报告回来,我很好奇。
我认为这样做的唯一方法是通过 ajax 获取文件的内容,然后设置一个计时器。如果请求在计时器之前完成,您可以使用 eval 评估响应(这不是更好的解决方案),否则您可以停止 ajax 请求并编写错误消息。