我遇到了一种非常奇怪的JavaScript行为。 我使用的是jQuery 1.9和farbtastic颜色选择器:
虽然此代码有效:
$('#colorpicker_1').hide();
$('#colorpicker_1').farbtastic('#color_1');
$('#colorbody_1').click(function(){$('#colorpicker_1').slideToggle()});
$('#colorpicker_2').hide();
$('#colorpicker_2').farbtastic('#color_2');
$('#colorbody_2').click(function(){$('#colorpicker_2').slideToggle()});
$('#colorpicker_3').hide();
$('#colorpicker_3').farbtastic('#color_3');
$('#colorbody_3').click(function(){$('#colorpicker_3').slideToggle()});
$('#colorpicker_4').hide();
$('#colorpicker_4').farbtastic('#color_4');
$('#colorbody_4').click(function(){$('#colorpicker_4').slideToggle()});
这不起作用,我完全没有线索,为什么不这样做:
var cstatusIDs = new Array();
cstatusIDs.push(1);
cstatusIDs.push(2);
cstatusIDs.push(3);
cstatusIDs.push(4);
for(var z=0; z < cstatusIDs.length; z++)
{
var cstatus_id = cstatusIDs[z];
console.log(cstatus_id); // outputs 1,2,3,4
$('#colorpicker_'+cstatus_id).hide();
$('#colorpicker_'+cstatus_id).farbtastic('#color_'+cstatus_id);
$('#colorbody_'+cstatus_id).click(function(){$('#colorpicker_'+cstatus_id).slideToggle()});
}
有什么想法吗?
答案 0 :(得分:3)
问题在于cstatus_id
在单击处理程序的范围之外定义,并且每次循环运行时其值都会更改。由于在您触发click事件之前实际上并未对click处理程序进行求值,因此当时所有处理程序都使用最后一个cstatus_id
值。
要解决此问题,请将处理程序包装在闭包中,以便每个实例都获得自己唯一的ID。
var cstatusIDs = [1, 2, 3, 4];
for(var z=0; z < cstatusIDs.length; z++)
{
var cstatus_id = cstatusIDs[z];
console.log(cstatus_id); // outputs 1,2,3,4
$('#colorpicker_'+cstatus_id).hide();
$('#colorpicker_'+cstatus_id).farbtastic('#color_'+cstatus_id);
(function(id) {
$('#colorbody_' + id).click( function() {
$('#colorpicker_' + id).slideToggle()
});
})(cstatus_id)
}