我的合作伙伴已经创建了一个脚本,但他目前处于离线状态,所以我自己试图解决这个问题。
以下是我们目前的代码:
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中,它只会将进度调整一次然后什么都不做。
这有什么问题?我不确定是否需要更多代码,如果是,我会用更多代码编辑我的问题。
谢谢。
答案 0 :(得分:2)
如果没有response
的值,并且没有更多的上下文,那就很难说。控制台说什么?有错误吗?
另外,为什么不从服务器获取数据,然后解析数据并做出相应的响应,除了其他优点(比如将客户端代码保存在一个地方并强制执行结构)之外,这使得这样的调试案例变得更加简单?比eval
好得多,只是相信无论回来什么都知道如何处理自己。
同样作为良好做法,请将您的javascript保存在javascript中,而不是将要评估的字符串。因此,不是你的setInterval
,而是有一个匿名函数:
ProgressStatus = setInterval(function(){
progressStatus( $('#Progress').val() );
}, 1000);
答案 1 :(得分:1)
不起作用意味着什么都没有。将来请详细说明不起作用的方法。我将假设它意味着它永远不会更新get请求的新状态并继续抓住旧的状态。
需要停止缓存
$.ajax({
url: "http://www.site.com/progress/"+Progress,
cache: false,
success: function (response) {
// Evil Eval our response
eval(response);
}
});
答案 2 :(得分:1)
由于setInterval
没有标准,因此将字符串作为第一个参数提供的结果可能会因浏览器而异。正如MDC says:
备用语法中的
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);
但是,再次使用网址(Progress
)和eval
中的用户可修改输入字段来解析(?)没有任何验证的响应非常不安全 。您应该在闭包中使用一个变量来设置Progress
(除了向用户显示)。
答案 3 :(得分:1)
我猜问题是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);
});
}
如果有任何网址重写问题,您需要处理。
答案 4 :(得分:0)
我认为您需要以这种方式编辑第二个代码:
$(document).ready(function(){
var Progress = $('#Progress').val();
ProgressStatus = setInterval('progressStatus("'+Progress+'")', 1000);
}
可能就是这样。如果有用,试试这个。我对jQuery并不是很了解,但如果我没错,那将是一个解决方案。
答案 5 :(得分:0)
你的setInterval中有关于Progress的特定原因吗? Javascript不关心类型..
尝试
ProgressStatus = setInterval(function(){ progressStatus(Progress); }, 1000);
IMO它更漂亮,更具可读性,但如果它能解决你的问题则不知道:)