Javascript jQuery中的变量范围问题
我试图在jQuery中捕获两个select元素的更改事件。我试图在一个循环中完成它,这样我就不必剪切和粘贴相同的代码 尽管var x=$+字段[i].val 编辑 对不起,这是一个过于简化的例子。实际上,我想得到一堆附近的字段,而不必进行剪切和粘贴。这是我的实际代码: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
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,因此它未定义。