我有一些javascript正在创建一个基于AJAX搜索后从后端返回的对象的li。用户可以继续搜索设备,并在选择时将它们添加到当前页面(作为li)。每次创建新的li时,我都想发送已经选择的对象的id。
当创建li时,它们的id被命名为“device - ###”,其中###是数据库中设备的ID,因此我需要删除该部分。
这是给我提问的javascript:
var children = $('#temp_inventory').children();
var count = children.length;
var devices = [];
var i = 0;
while (i<=count){
devices[i] = children[i].id.substr(4);
i++;
};
我收到以下错误:
Uncaught TypeError: Object #<HTMLLIElement> has no method 'attr'
我也尝试过非jQuery方式:
devices[i] = children[i].id.substr(4);
我最终得到了这个错误:
Uncaught TypeError: Cannot read property 'id' of undefined
当我投入alert(children[i].id.substr(4));
时,我会收到一个警告,其中包含我期待的号码。
答案 0 :(得分:4)
部分问题可能是您的循环使用<=
而不是<
。请记住,列表中使用从零开始的索引的最后一项是length - 1
。
要创建ID数组,您可以使用map()
(docs)方法。
var devices = $('#temp_inventory').children().map(function() {
return this.id.substr(4);
}).get();
.map()
方法使用函数中返回的值填充jQuery对象(类似于数组的对象)。
然后get()
(docs)方法为您提供了这些值的数组而不是jQuery对象。
你也可以使用toArray()
(docs)方法做同样的事情。
var devices = $('#temp_inventory').children().map(function() {
return this.id.substr(4);
}).toArray();
答案 1 :(得分:3)
我想你可能想要,
while (i<count){
devices[i] = children[i].id.substr(4);
i++;
};
否则最后一次迭代将超出数组中的最后一项。
使用$.map()
var devices = $.map($('#temp_inventory').children(), function(elem) {
return elem.id.substr(4);
});