【问题标题】:$.getjson IE-specific error$.getjson IE 特定错误
【发布时间】:2017-02-17 19:36:48
【问题描述】:

通过使用 for-loop 向服务器询问几个数据库条目,我编写了一段代码,效果很好,但是

神奇的是,这段代码在 IE11 上不起作用。 对于 Google Chrome、Firefox、Safari,...,它运行良好。但不幸的是我需要使用 IE11。该代码没有给出错误,但是从服务器返回的数据不存在。只传输了 for - 循环中的最后一个元素。

通过使用 IE 网络连接表示工具,可以看到所有请求都被发回了,但不知何故只有最后一个已经存在。可能有人已经遇到过这个问题,可以给我一些提示...

function getData(setAddress_Event, liter_hour, Fluid_id, dateArray){
          return $.getJSON(setAddress_Event + liter_hour + Fluid_id + "/" + dateArray).then(function(data){
            return {
              data_list:data
            };
          });
        }

       //get day2day data
        var numPendingResults = dateArray.length;
        //new var declaration --> "let" is only valid inside the for loop!!
        for(let j = 0; j<dateArray.length; j++)
        {
        getData(setAddress_Event(), "liter_hour/", Fluid_id, dateArray[j]).then(function(returndata){
          //received data!
          data_collection[j] = returndata;
          numPendingResults--; // one less to wait for!
          if (!numPendingResults) { // we have everything!
            //console.log(data_collection);
            //function call which sends the data forward
            dataReady(data_collection, data_limit);
          }

dataReady 函数应该处理接收到的数据,但不知何故使用 IE11,只有来自循环的最后一个请求!因此我决定开一个新的问题。说不定哪位高手能给我点提示...

【问题讨论】:

  • “神奇的是,这段代码在 IE 上不起作用” - 我认为每个 Web 开发人员都至少说过一次这些话...... :(

标签: javascript jquery ajax internet-explorer getjson


【解决方案1】:

这是 IE11 与规范不兼容。1 不幸的是,for 循环中的let 在 IE9-IE11(以及 Edge 直到并包括 Edge 13;Edge 14 最终做对了)。在与 ES2015(又名“ES6”)规范兼容的浏览器中,此代码应显示 1、2、3、4、5;但在 IE11 上,它会显示 6、6、6、6、6(就像我们使用 var 时一样)。

for (let i = 1; i <= 5; ++i) {
  setTimeout(function() {
    console.log(i);
  }, 0);
}

你有几个选择:

  1. dealing with closures in loops 使用其他解决方案之一,而不是let 解决方案。
  2. 使用let,但循环中

这是#2,它在 IE11 上正常工作:

for (let i = 1; i <= 5; ++i) {
  let inner = i; // Different variable
  setTimeout(function() {
    console.log(inner);
  }, 0);
}

1 最初我称它为“错误”,但值得注意的是,IE11 比最终的 ES2015 规范早两年发布,而循环中 let 的确切语义在规范过程,因此可能只是微软抢先一步并实施了他们认为基于当前对话的内容,只是在最终规范出来之前对其进行了更改。这是在规范过程中过早实施的危险。 (与此同时,该流程本身已经更加正式,以帮助供应商避免此类事情。)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-20
    • 1970-01-01
    • 1970-01-01
    • 2011-03-23
    相关资源
    最近更新 更多