javascript for-loop没有获取id值

时间:2010-12-13 14:47:57

标签: javascript loops

考虑我有10个输入框,(使用datepicker插件Fyi)

我对点击输入框时有一套特定的要求,或者同时点击了plux / minus div(根据需要显示/隐藏10个框)。

这个循环似乎没有拾取x和y变量。

警报我总是以回声6为例..不知道为什么......

这是我的循环...以及为什么x和y似乎没有设置的想法?

for (var x = 1; x <= 10; x++) {
    var y = x+1;
    $('#date_start'+y).attr("disabled", "disabled");
    $('#date_start'+x).datetimepicker();

    $('#date_start'+x).blur(function() {
        if (isset($('#date_start'+x).val())) {
            $('.add_time_'+x).css('visibility', 'visible');
        } else {
            $('.add_time_'+x).css('visibility', 'hidden');
            $('.rem_time_'+y).css('visibility', 'hidden');
        }
    });

    $('.add_time_'+x).click(function() {
        alert('ici: ' + y);
        $('.date_'+y).css('visibility', 'visible');
        $('#date_start'+y).removeAttr("disabled");
        $('.rem_time_'+y).css('visibility', 'visible');
    });

    $('.rem_time_'+y).click(function() {
        $('.date_'+y).css('visibility', 'hidden');
        $('#date_start'+y).attr("disabled", "disabled");
        $('#date_start'+y).val('');
        $('.rem_time_'+y).css('visibility', 'hidden');
        $('.add_time_'+y).css('visibility', 'hidden');
    });
}

=== 注意,isset,是一个单独的函数,我必须检查字段值是否为空/未设置 当我尝试回显$('#date_start'+ x).val()

的值时

它回声未定义...即使相应的输入在屏幕上有值。

1 个答案:

答案 0 :(得分:2)

在事件处理程序中使用外部变量时,需要包装闭包。让我们举个例子:

$('#date_start'+x).blur(function() {
        if (isset($('#date_start'+x).val())) {
            $('.add_time_'+x).css('visibility', 'visible');
        } else {
            $('.add_time_'+x).css('visibility', 'hidden');
            $('.rem_time_'+y).css('visibility', 'hidden');
        }
    });

这将始终使用外部变量x和y的最后一个值,而不是创建此事件处理程序时的值。你需要做的是将它包装在一个立即执行的函数中:

$('#date_start'+x).blur((function(xlocal, ylocal) {
        return function() {
            if (isset($('#date_start'+xlocal).val())) {
                $('.add_time_'+xlocal).css('visibility', 'visible');
            } else {
                $('.add_time_'+xlocal).css('visibility', 'hidden');
                $('.rem_time_'+ylocal).css('visibility', 'hidden');
            }
        }
    })(x,y));