Javascript 用数字填充数组
我有这样的情况: 有8个div块,ID为'rateN_wrapper',其中'N'是div的数量:Javascript 用数字填充数组,javascript,jquery,arrays,Javascript,Jquery,Arrays,我有这样的情况: 有8个div块,ID为'rateN_wrapper',其中'N'是div的数量: <div id="rate1_wrapper"> <a href="#" id="0_1">...</a> <a href="#" id="0_2">...</a> <a href="#" id="0_3">...</a> </div> <div id="rate2_wrapper"
<div id="rate1_wrapper">
<a href="#" id="0_1">...</a>
<a href="#" id="0_2">...</a>
<a href="#" id="0_3">...</a>
</div>
<div id="rate2_wrapper">
<a href="#" id="1_1">...</a>
<a href="#" id="1_2">...</a>
<a href="#" id="1_3">...</a>
</div>
...
var ratings = new Array();
for (i=0; i < 8; i++)
{
ratings[i] = -1; // Default is unrated
}
for (i=0; i < 8; i++)
{
$('#rate' + i + '_wrapper a').click(function() {
ratings[i] = parseInt( $(this).attr('id').split('_')[1] );
console.debug(ratings);
});
}
...
var评级=新数组();
对于(i=0;i<8;i++)
{
评级[i]=-1;//默认值未评级
}
对于(i=0;i<8;i++)
{
$(“#rate”+i+“_包装器a”)。单击(函数(){
评级[i]=parseInt($(this).attr('id').split('uu')[1]);
控制台调试(额定值);
});
}
我的工作是用点击链接的id(已解析)填充需要的数组。但它总是只更改数组(8)的最新元素。为什么?因为您创建的函数正在关闭i变量。它在当前值处看到对i的引用,而不是创建函数时的值。for循环退出后,我将是8岁,因此所有匿名函数都将更新
评级[8]
。我认为这可能会解决这个问题:
for (i=0; i < 8; i++)
{
var idx = i;
$('#rate' + idx + '_wrapper a').click(function() {
ratings[idx] = parseInt( $(this).attr('id').split('_')[1] );
console.debug(ratings);
});
}
因此,您将创建一个函数,该函数将创建一个具有正确索引的匿名函数。返回的匿名函数将在创建时看到
idx
的值。这是由于for循环中的闭包造成的问题。您可以通过解析父id来查找id:
for (i=0; i < 8; i++)
{
$('#rate' + i + '_wrapper a').click(function() {
var parentId = $(this).parent('div').attr('id');
var index = /\d/.exec(parentId);
ratings[index] = parseInt( $(this).attr('id').split('_')[1] );
});
}
(i=0;i<8;i++)的
{
$(“#rate”+i+“_包装器a”)。单击(函数(){
var parentId=$(this.parent('div').attr('id');
var index=/\d/.exec(parentId);
评级[索引]=parseInt($(this).attr('id').split('uu')[1]);
});
}
使用jquery也可以完全避免for循环。each()可能更清晰实际上,想想看,如果在匿名函数体中而不是外部循环体中声明var idx=i,第一个示例将有效…@jarrett我不能在这里使用each(),我没有对象的静态名称。使用每个对象不需要静态名称
for (i=0; i < 8; i++)
{
$('#rate' + i + '_wrapper a').click(function() {
var parentId = $(this).parent('div').attr('id');
var index = /\d/.exec(parentId);
ratings[index] = parseInt( $(this).attr('id').split('_')[1] );
});
}