0

我已经在这里待了一个小时,我需要帮助。这让我有点莫名其妙。考虑我的代码中对象的这种显式设置:

工作案例:


var terms={};
            terms[0]={}; 
            terms[1]={"label":"bag","cell_src":"images/bag.jpg","clue_type":"audio","clue_src":"/audio/bus.wav"};
            terms[2]={"label":"crayon","cell_src":"images/crayon.jpg","clue_type":"audio","clue_src":"/audio/car.wav"};
            terms[3]={"label":"pen","cell_src":"images/pen.jpg","clue_type":"audio","clue_src":"/audio/car.wav"};
            terms[4]={"label":"pencil","cell_src":"images/pencil.jpg","clue_src":"/audio/boat.wav"};
            terms[5]={"label":"pencil_case","cell_src":"images/pencil_case.jpg","clue_src":"/audio/train.wav"};
            terms[6]={"label":"rubber","cell_src":"images/rubber.jpg","clue_src":"/audio/taxi.wav"};
            terms[7]={"label":"ruler","cell_src":"images/ruler.jpg","clue_src":"/audio/plane.wav"};
            terms[8]={"label":"sharpener","cell_src":"images/sharpener.jpg","clue_src":"/audio/taxi.wav"}; 
           window.terms= terms;
window.terms= terms; // for using globaly 

如果我做一个 console.log(window.terms[1]); 我得到“包”。这就是我想要的。

不工作的情况


如果不是显式定义 term{} 的值,而是从 json 文件中读取内容并将它们分配给每个枚举索引,如下所示:

var terms={};
terms[0]={};
$.getJSON('content.json', function(data){

  $.each(data,function(i){
    //terms[i]={"label":"bag","cell_src":"images/bag.jpg","clue_type":"audio","clue_src":"/audio/bus.wav"};
    terms[i+1]={"label":data[i].headword,"cell_src":data[i].image,"clue_type":"audio","clue_src":data[i].audio};

  });
  window.terms=terms;   
});

如果我做一个 console.log(window.terms[1]); 我收到一个错误“Uncaught TypeError: Cannot read property '1' of undefined”请注意,我有一个替代尝试注释掉了,我消除了我试图拉入的值出现奇怪的可能性,我明确分配所有索引都具有相同的静态值。这会产生相同的错误。

任何想法这怎么可能?

4

3 回答 3

1

$.getJSON执行 AJAX 调用时不会阻塞。您必须保持回调链处于活动状态。

于 2013-03-21T15:58:06.947 回答
1

$.getJSON()函数只是调用$.ajax()加载 JSON 文件的简写。由于 AJAX 调用是异步的,$.getJSON()因此在数据被加载并存储在变量中之前,执行完成,以及执行之后的任何代码。

如果您想termssuccess传递给$.getJSON().

如果您的代码如下所示:

var terms={};
terms[0]={};
$.getJSON('content.json', function(data){

  $.each(data,function(i){
    //terms[i]={"label":"bag","cell_src":"images/bag.jpg","clue_type":"audio","clue_src":"/audio/bus.wav"};
    terms[i+1]={"label":data[i].headword,"cell_src":data[i].image,"clue_type":"audio","clue_src":data[i].audio};

  });
  window.terms=terms;   
});

// use window.terms here

然后它将不起作用,因为 // use window.terms here 部分在AJAX 调用完成之前执行。您需要将其移至单独的函数并从success回调中调用它:

function workWithTerms() {
    // use window.terms here
}

var terms={};
terms[0]={};
$.getJSON('content.json', function(data){

  $.each(data,function(i){
    //terms[i]={"label":"bag","cell_src":"images/bag.jpg","clue_type":"audio","clue_src":"/audio/bus.wav"};
    terms[i+1]={"label":data[i].headword,"cell_src":data[i].image,"clue_type":"audio","clue_src":data[i].audio};

  });
  window.terms=terms;   
  workWithTerms();
});
于 2013-03-21T16:00:13.903 回答
1

我认为您想将术语定义为对象数组。目前,您已将其定义为具有属性 1、2、3 等的对象。类似 mean 的语法var terms = {}terms一个对象,当您分配时,terms[1] = {"label": "bag"}您是在说“名为 1 的对象术语的属性是{"label": "bag"}. 只需将您的术语声明更改为:

var terms = [];

此外,如果您想查看其中一个对象的标签属性,则日志语句将如下所示:

console.log(terms[2].label);
于 2013-03-21T16:05:19.623 回答