【问题标题】:Weird JavaScript behavior奇怪的 JavaScript 行为
【发布时间】:2013-01-20 07:20:36
【问题描述】:

我遇到了一个非常奇怪的 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()});
}

有什么想法吗?

【问题讨论】:

  • “奇怪的行为”和“不起作用”对解决问题没有帮助。请准确描述正在发生/未发生的事情以及您期望发生的事情。
  • 考虑使用类而不是 id-s。
  • 我描述为工作的第一个代码正是它应该做的。 onclick 到一个 TD 元素 id=colorbody_n 打开 farbtastic 颜色选择器。不工作的例子(for循环)只使最后一个TD(id=4)工作。在点击 TD(1,2 或 3)时,总是打开 id 为 4 的 td
  • 我们不知道你在问什么兄弟 :) 请解释一下你想要什么

标签: javascript jquery scope closures


【解决方案1】:

问题在于cstatus_id 是在单击处理程序范围之外定义的,并且每次循环运行时它的值都会发生变化。由于在触发单击事件之前不会实际评估单击处理程序,因此所有处理程序都使用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)
}

【讨论】:

  • @August 没问题!请注意创建和填充数组的简写语法。
猜你喜欢
  • 2011-07-28
  • 2012-05-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多