Javascript jQuery中的变量范围问题

Javascript jQuery中的变量范围问题,javascript,jquery,Javascript,Jquery,我试图在jQuery中捕获两个select元素的更改事件。我试图在一个循环中完成它,这样我就不必剪切和粘贴相同的代码 尽管var x=$+字段[i].val 编辑 对不起,这是一个过于简化的例子。实际上,我想得到一堆附近的字段,而不必进行剪切和粘贴。这是我的实际代码: var fieldnames = ['start_date', 'end_date'] for (var i=0; i < fieldnames.length; i++) { var fieldname = fiel

我试图在jQuery中捕获两个select元素的更改事件。我试图在一个循环中完成它,这样我就不必剪切和粘贴相同的代码

尽管var x=$+字段[i].val

编辑

对不起,这是一个过于简化的例子。实际上,我想得到一堆附近的字段,而不必进行剪切和粘贴。这是我的实际代码:

var fieldnames = ['start_date', 'end_date']
for (var i=0; i < fieldnames.length; i++)
{
    var fieldname = fieldnames[i];

$("#event_"+fieldname+"_date, #event_"+fieldname+"_hour, #event_"+fieldname+"_minute, #event_"+fieldname+"_ampm").change(function(){

    var d = $("#event_"+fieldname+"_date").val();
    var h = $("#event_"+fieldname+"_hour").val();
    var m = $("#event_"+fieldname+"_minute").val();
    var ampm = $("#event_"+fieldname+"_ampm").val();

    $("#event_"+fieldname).val(d + ' ' + h + ':' + m + ampm);

    if ( $("#event_"+fieldname).val() == " :" ){
        $("#event_"+fieldname).val("");
    }

    if (fieldname == "start_date")
    {
        $.validator.methods.validMoment.call(this, $("#event_"+fieldname).val(), $("#event_"+fieldname), null);
    }else
    {
        $.validator.methods.validOptionalMoment.call(this, $("#event_"+fieldname).val(), $("#event_"+fieldname), null);
    }
});
}


我想我可以用Ruby生成代码,而不用担心用Javascript做任何把戏,但我很好奇…

noooooo。。。没有循环。只需创建一个事件处理程序并使用this关键字来获取正确的元素

$("select").change(function(){
    var x = $(this).val();
    alert(x);
});

不。。。没有循环。只需创建一个事件处理程序并使用this关键字来获取正确的元素

$("select").change(function(){
    var x = $(this).val();
    alert(x);
});

你应该把它换成

$("#"+fields[i]).change(function () {
        var x = this.value;
        alert(x);
});
对于您的代码,问题是无论您更改什么字段,由于for循环,您都将始终显示最后一个字段的值。换句话说:当更改事件发生时,alert语句中字段[i]的值始终显示最后一个未定义字段的值,正如Chris正确地提醒我的那样


作为旁注,没有必要使用jQuery:您可以使用这个值。您应该将其更改为

$("#"+fields[i]).change(function () {
        var x = this.value;
        alert(x);
});
对于您的代码,问题是无论您更改什么字段,由于for循环,您都将始终显示最后一个字段的值。换句话说:当更改事件发生时,alert语句中字段[i]的值始终显示最后一个未定义字段的值,正如Chris正确地提醒我的那样

作为旁注,没有必要使用jQuery:您可以使用这个.value

你应该这样做


您需要在for循环中使用此指针


您需要在for循环中使用此指针

请尝试以下操作:

fields = ['foo', 'bar'];

for (var i=0; i < fields.length; i++)
{
    $("#"+fields[i]).change(function () {
        var x = $(this).val();
        alert(x);
    });
}
工作小提琴:

尝试以下操作:

fields = ['foo', 'bar'];

for (var i=0; i < fields.length; i++)
{
    $("#"+fields[i]).change(function () {
        var x = $(this).val();
        alert(x);
    });
}
工作小提琴:

更换:

var x = $("#"+fields[i]).val();  
致:

替换:

var x = $("#"+fields[i]).val();  
致:

每次迭代只需使用$

var fields = ['foo', 'bar'];

$.each(fields, function(idx, field){
     $("#"+field).change(function () {
            var x = $("#"+field).val();
            alert(x);
    });
});
这将解决范围问题。问题是,在您的正常for循环iteartion之后,我将是2,并且我不会被保存在每次迭代的作用域中。在处理程序的执行时间结束时,i将始终为2。$。每个项目都自动将每个项目的范围分开

为了完整性起见,此问题的非jQuery解决方案是:

var fields = ['foo', 'bar'];

for (var i=0; i < fields.length; i++){
    (function(i){
       $("#"+fields[i]).change(function () {
            var x = $("#"+fields[i]).val();
            alert(x);
        });
    })(i);
}
其效果与上述解决方案基本相同。您的代码被包装在一个函数中,我被粘在您的函数范围中作为自执行函数的参数。

只需在迭代中使用$

var fields = ['foo', 'bar'];

$.each(fields, function(idx, field){
     $("#"+field).change(function () {
            var x = $("#"+field).val();
            alert(x);
    });
});
这将解决范围问题。问题是,在您的正常for循环iteartion之后,我将是2,并且我不会被保存在每次迭代的作用域中。在处理程序的执行时间结束时,i将始终为2。$。每个项目都自动将每个项目的范围分开

为了完整性起见,此问题的非jQuery解决方案是:

var fields = ['foo', 'bar'];

for (var i=0; i < fields.length; i++){
    (function(i){
       $("#"+fields[i]).change(function () {
            var x = $("#"+fields[i]).val();
            alert(x);
        });
    })(i);
}

其效果与上述解决方案基本相同。您的代码被包装在一个函数中,我被粘在您的函数范围中作为自执行函数的参数。

Use:var x=this.value;用法:var x=此值;这是一个过于简化的例子。实际上我有很多值,我想在附近读。这就像是一个切割和切割的过程pasting@Dex当前位置显示真实示例,我相信会有更好的方法这是一个过于简化的示例。实际上我有很多值,我想在附近读。这就像是一个切割和切割的过程pasting@Dex当前位置显示真实的例子,我相信会有更好的方法,我认为这是我真正想要的。我已经用实际的代码更新了我的例子,因为我的例子太简单了。我想这就是我想要的。我已经用实际的代码更新了我的示例,因为我的示例太简单了。它甚至不是最后一个元素。由于for循环和字段[2]中的i++未定义,迭代后的i为2,因此它未定义。它甚至不是最后一个元素。由于for循环中的i++和字段[2]未定义,因此在迭代后i为2,因此它未定义。