2012-03-01 76 views
1

我有一个问题,从我的关联数组中检索数据。IE 7不支持关联数组?

需要明确的是,这是我的代码是:

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的开发工具:

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

编辑:大型代码片段:

它基本上是两个输入字段搜索(使用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... 
} 
+0

代码不足。很明显,当您尝试访问它时,'modelTable'不在范围内,因此您需要使它成为样本,但没有更大的片段,我们无法告诉您具体如何。 – Jon 2012-03-01 10:40:43

+0

你的意思是'data'具有那个JSON值吧?不'val' – 2012-03-01 10:41:58

+0

@Jon'modelTable'在顶层作用域中声明(不在dom-ready中)。然后我会添加更多的代码。 – KristianB 2012-03-01 11:01:23

回答

0

如果你正在展示的代码后,DOM就绪时,$()回调将被执行同步执行。例如,该代码的输出:

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

取决于是否它之前执行DOM就绪(将第一输出2,再后来–当DOM终于准备– 1)或之后准备就绪(在这种情况下,它将输出1,然后2)。

我怀疑,当DOM准备好你的代码才会执行​​(例如,它是在异步加载的文件,或者是本身包裹在$()调用)。无论这种情况是否真的发生,都可能取决于所使用的浏览器,因为脚本标记上的defer属性的可用性或DOM的构建速度实际上可能会影响这一点。这只是猜测;没有更多的上下文很难说清楚。

如果这是正确的,但是,立即调用init_mc_makes();特别是在分配之前调用

modelTable = {} 

被制成。由于可变吊装,此时modelTable已存在,但它是undefined

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

var modelTable = {}; 

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