JavaScript传递变量到内部点击功能不起作用

时间:2012-04-14 15:05:58

标签: javascript function variables

我似乎无法弄清楚这一点。它对于 for循环的第一部分工作得很好,但是在内部点击函数中我失去了var,我评论它在哪里断开...

另外,可能还有一种更清晰的方式来编写它:

$(function () {
var a = "rgb(58,88,90)";
var b = "rgb(123,156,158)";
for (var c = 1; c <= 3; c++) {
    if ($("#select" + c).is(":checked")) {
        $("#select" + c + "-icon").css("background", a);
        var d = document.getElementById("select" + c + "_title").innerHTML;
        $("#Selection_" + c).val(d)
    } else {
        $("#select" + c + "-icon").css("background", b);
        $("#Selection_" + c).val("Off")
    }
    $("#select" + c).click(function () {
    // here's where it stops working... var c is no longer recognized...
        if ($("#select" + c).is(":checked")) {
        $("#select" + c + "-icon").css("background", a);
        var d = document.getElementById("select" + c + "_title").innerHTML;
        $("#Selection_" + c).val(d)
    } else {
        $("#select" + c + "-icon").css("background", b);
        $("#Selection_" + c).val("Off")
    }
    })
}
return false });

以下是第一对目标对象:

<label for="select1"><aside id="select1-icon" class="icon-form right rounded"><img src="../common/images/icon-viewDemo.png" /></aside>
                <input type="checkbox" id="select1" name="select" checked="checked" class="view" /> <h5 id="select1_title">Watch Demo</h5></label>

<input type="hidden" id="Selection_1" name="Selection_1" value=""/>

2 个答案:

答案 0 :(得分:2)

您正在捕获循环变量,因此当for循环结束时,变量c的值为4,这是函数执行时看到的值。

var x;
for (var c = 0; c <= 3; c++) {
  x = function() { alert(c); };
}
x();

这会提醒4,因为当您致电x()时,变量c的值为4

如果要捕获c的值而不是变量本身,可以为每个函数分别设置一个副本。为了便于阅读,我将处理程序拆分为一个单独的本地函数。

function createClickHandler(c) {
    return function() {
        if ($("#select" + c).is(":checked")) {
            $("#select" + c + "-icon").css("background", a);
            var d = document.getElementById("select" + c + "_title").innerHTML;
            $("#Selection_" + c).val(d)
        } else {
            $("#select" + c + "-icon").css("background", b);
            $("#Selection_" + c).val("Off")
        }
    }
};
$("#select" + c).click(createClickHandler(c));

您可以详细了解此现象on this Web pagethis earlier stackoverflow question

答案 1 :(得分:0)

c在全局范围内不存在,因此单击时不存在。如果您将其设置为全局,则在单击发生时它将不具有您想要的值。所以使用eval();用它的文字值替换c,因此当点击时,你有你想要的值。

$(
    function () {
        var a = "rgb(58,88,90)";
        var b = "rgb(123,156,158)";
        for (var c = 1; c <= 3; c++) {
            if ($("#select" + c).is(":checked")) {
                $("#select" + c + "-icon").css("background", a);
                var d = document.getElementById("select" + c + "_title").innerHTML;
                $("#Selection_" + c).val(d);
            } else {
                $("#select" + c + "-icon").css("background", b);
                $("#Selection_" + c).val("Off");
            }
            eval(
                '$("#select"' + c + ').click(function () {' +
                    'if ($("#select"' + c + ').is(":checked")) {' +
                        '$("#select"' + c + '"-icon").css("background", a);' +
                        'var d = document.getElementById("select"' + c +
                            '"_title").innerHTML;' +
                        '$("#Selection_"' + c + ').val(d)' +
                    '} else {' +
                        '$("#select"' + c + '"-icon").css("background", b);' +
                        '$("#Selection_"' + c + ').val("Off");' +
                    '}' +
                '});'
            );
        }
        return false;
    }
);