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

时间:2011-05-12 10:48:45

标签: javascript ajax internet-explorer

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

以下是我们目前的代码:

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中,它只会将进度调整一次然后什么都不做。

这有什么问题?我不确定是否需要更多代码,如果是,我会用更多代码编辑我的问题。

谢谢。

6 个答案:

答案 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它更漂亮,更具可读性,但如果它能解决你的问题则不知道:)