我一直在构建Twitter引导程序Typeahead插件的一些示例代码。使用jQuery将外部JSON文件拉入JavaScript变量
在脚本的早期开发版本中,我包括了以下内容,几乎直接从示例中解除了一些完美工作的定制;
$('.building_selector').typeahead({
source: function (query, process) {
buildings = [];
map = {};
var data = [{"buildingNumber":"1","buildingDescription":"Building One"},{"buildingNumber":"2","buildingDescription":"Building Two"},{"buildingNumber":"3","buildingDescription":"Building Three"}];
$.each(data, function (i, building) {
map[building.buildingDescription] = building;
buildings.push(building.buildingDescription);
});
process(buildings);
},
updater: function (item) {
selectedBuilding = map[item].buildingNumber;
return item;
},
});
在实践中,这是没有多大用处,而我已经有了一个直接写入代码的选项的数组,所以我一直在寻找读书与JSON外部文件写在我”我创建了一个文件,只包含如下的数组;
[{"buildingNumber":"1","buildingDescription":"Building One"},
{"buildingNumber":"2","buildingDescription":"Building Two"},
{"buildingNumber":"3","buildingDescription":"Building Three"}]
而我现在试图更新Javascript以包含加载远程文件的代码。我可以验证文件是否存在并位于正确的相对位置。
$('.building_selector').typeahead({
source: function (query, process) {
buildings = [];
map = {};
var data = function() {
$.ajax({
'async': false,
'global': false,
'url': "../json/buildings",
'dataType': "json",
'success': function (result) {
data = result;
}
});
return data;
}();
$.each(data, function (i, building) {
map[building.buildingDescription] = building;
buildings.push(building.buildingDescription);
});
process(buildings);
},
updater: function (item) {
selectedBuilding = map[item].buildingNumber;
return item;
},
});
在运行的页面,所有的元素出现预期的工作,直到您单击文本字段,并为输入内容没有出现在控制台。在每次按键之后,没有任何明显的事情发生,但是在控制台中产生了以下内容;
Uncaught TypeError: Cannot read property 'length' of undefined [jquery.min.js:3]
任何想法/想法/起点来尝试和解决这个问题将不胜感激!
'async':false,'是坏的...并且不推荐使用。将代码移动到'process(buildings);'在'success'回调中。不确定是否可以接受,但如果json文件是静态的,可以将其包含在页面的脚本标记中,并跳过使用AJAX。只需在数组前添加'var myBuildingData =',并在'source'函数中处理该变量 – charlietfl