在FF,Chrome而不是IE工作?怎么了



我的合作伙伴创建了一个脚本,但他目前处于离线状态,所以我正在尝试自己解决这个问题。

这是我们目前拥有的代码:

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,但如果我没有错的话,这将是一个解决方案。

最新更新