【问题标题】:Associative Arrays not supported in IE 7?IE 7 不支持关联数组?
【发布时间】:2012-03-19 20:31:07
【问题描述】:

我在从关联数组中检索数据时遇到问题。

要清楚,这就是我的代码:

var modelTable = {};

然后我将一些东西保存到对象中:

//inside getJSON-call:
$.each(data.Models, function (index, val) {
    modelTable[val.Name] = val;
});

在这种情况下,val 只是一个 json 对象:

{
    Models : [
        {
            Name: "4-stroke (EBE)",
            ModelNumber: "VRE",
            Engine: "125ccm"
        }
    ]
}

但是当我尝试像这样从我的modelTable 获取数据时:

var model = modelTable["4-stroke (EBE)"];

根据 IE 的开发者工具,该对象为 null 或未定义:

SCRIPT5007: Unable to get value of the property 'Name': object is null or undefined 

编辑:大代码-sn-ps:

它基本上是两个用于搜索的输入字段(使用 jQuery UI 自动完成;不重要)。 第一个框,用于选择摩托车品牌(品牌),然后在选择品牌时填充第二个并包含模型名称。第二个输入字段的值(javascript .text()用于查找modelTable中的所有特定数据,因为我需要这些数据来提交我的搜索表单。

$(function () {
    if ($('#mc_search').length) {
        init_mc_makes();
    }
});

var modelTable = {};

function init_mc_makes() {
    //populates the brand drop down list in jquery ui autocomplete
}

function init_mc_models() {
    //populates the model drop down list in jquery ui autocomplete
    //and iterates the json data to save associative data in modelTable
    //calls submitSearch(name, brand)
}

function submitSearch(name, brand) {
    var model = modelTable[name];
    var chosenModelNumber = model.ModelNumber; //Unable to get value of the property 'ModelNumber': object is null or undefined 
    //submits form with data...
}

【问题讨论】:

  • 没有足够的代码。显然modelTable 在您尝试访问它时不在范围内,因此您需要将其设置为,但如果没有更大的 sn-p,我们无法告诉您究竟如何。
  • 您的意思是 data 有那个 JSON 值,对吗?不是val
  • @Jon modelTable 在顶级范围内声明(不在 dom-ready 中)。我会添加更多代码。
  • IE7 不支持 JSON,IE8+ 可用。

标签: javascript object associative-array


【解决方案1】:

如果您显示的代码在 dom-ready 之后执行,$() 回调将同步执行。例如这段代码的输出:

$(function () { console.log(1); });
console.log(2);

取决于它是在 在 DOM 准备好之前执行(它将首先输出 2,然后稍后 - 当 DOM 最终准备好时 - 1)或 在 准备好了(在这种情况下,它将输出1,然后是2)。

我怀疑您的代码仅在 DOM 准备就绪时才执行(例如,它位于异步加载的文件中,或者本身包含在 $() 调用中)。是否发生这种情况可能确实取决于所使用的浏览器,因为脚本标签上defer 属性的可用性或DOM 的构建速度实际上会影响这一点。这只是猜测;没有更多的上下文很难说。

然而,如果这是正确的,init_mc_makes() 会立即被调用;特别是在赋值之前调用它

modelTable = {}

制作完成。由于变量提升,此时modelTable已经存在,但它是undefined

如果这个理论是正确的,移动

var modelTable = {};

以上$(...) 调用应该可以解决问题。

【讨论】:

    猜你喜欢
    • 2014-10-22
    • 1970-01-01
    • 1970-01-01
    • 2018-11-07
    • 2011-06-26
    • 2011-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多