我的合作伙伴创建了一个脚本,但他目前处于离线状态,所以我正在尝试自己解决这个问题。
这是我们目前拥有的代码:
function progressStatus(Progress) {
// Get our progress status
$.get('http://www.site.com/progress/'+Progress, { }, function (response) {
// Eval our response
eval(response);
});
}
然后在我们的页面中,我们有:
// Start our status checking
var Progress = $('#Progress').val();
ProgressStatus = setInterval('progressStatus("'+Progress+'")', 1000);
它在Firefox,Chrome中工作正常,我只能假设它在Firefox,Chrome中循环并获得新状态,但在IE中,它只ping一次进度,然后什么也不做。
这有什么问题?我不确定是否需要更多代码,如果是,我会用更多代码编辑我的问题。
谢谢。
如果没有response
的值,也没有更多的上下文,这有点难以分辨。控制台怎么说?有错误吗?
另外,为什么不从服务器获取数据,然后解析数据并做出相应的响应,这以及其他优点(例如将客户端代码保存在一个位置并强制执行结构)使调试这样的情况变得更加简单?比eval
它并仅仅相信任何回来的东西知道如何处理自己要好得多。
同样作为好的做法,将你的javascript保留在javascript中,而不是将被评估的字符串。所以代替你的setInterval
,有一个匿名函数:
ProgressStatus = setInterval(function(){
progressStatus( $('#Progress').val() );
}, 1000);
不工作意味着什么都没有。将来请更详细地说明不工作意味着什么。我将假设这意味着它永远不会更新 get 请求的新状态并继续抓取旧状态。
需要停止缓存
$.ajax({
url: "http://www.site.com/progress/"+Progress,
cache: false,
success: function (response) {
// Evil Eval our response
eval(response);
}
});
由于setInterval
没有标准,将字符串作为第一个参数的结果可能因浏览器而异。正如MDC所说:
code
在替代语法中,是要重复执行的代码字符串。
这就是Firefox和Chrome所表现出的行为。
另一方面,IE 可能会解析一次字符串并重复执行该字符串。这会稍微优化一些内容,但每次都会使用完全相同的参数调用您的函数。
此外,再次引用MDC
(不建议使用此语法,原因与使用 eval() 相同)
一种解决方案是在重复调用的函数中读取Progress
的状态:
function progressStatus() {
var Progress = $('#Progress').val();
// Get our progress status
$.get('http://www.site.com/progress/'+Progress, { }, function (response) {
// ↑ don't!
// Eval our response
eval(response); // don't!
});
}
这样您可以简单地调用
setInterval(progressStatus, 1000);
但同样,在URL(Progress
)中使用用户可修改的输入字段,并在没有任何验证的情况下eval
解析(?)响应是非常不安全的。您可能应该在维护Progress
的闭包中使用变量(除了向用户显示它)。
我想问题是IE中的缓存问题。大多数情况下,IE默认情况下会在设置中缓存。
您应该在末尾添加一个随机数,希望它完全有效。
function progressStatus(Progress) {
// Get our progress status
$.get('http://www.site.com/progress/'+Progress + "/rnd/" + Math.random(), { }, function (response) {
// Eval our response
eval(response);
});
}
您需要处理是否有任何 URL 重写问题。
在你的 setInterval 中进度周围出现"有没有特定的原因?Javascript不关心类型。
尝试
ProgressStatus = setInterval(function(){ progressStatus(Progress); }, 1000);
IMO 它更漂亮,更具可读性,但不知道它是否能解决您的问题:)
我认为您需要以这种方式编辑第二段代码:
$(document).ready(function(){
var Progress = $('#Progress').val();
ProgressStatus = setInterval('progressStatus("'+Progress+'")', 1000);
}
可能是这样。如果有用,请尝试此操作。我不太了解jQuery,但如果我没有错的话,这将是一个解决方案。