我正试图将相同的jQuery和JSON ASP.NET MVC3方法附加到两个不同的<select>
元素:
<select id="StartYear">
<option value="">Select Year</option>
<option value="2000">2000</option>
<option value="2001">2001</option>
</select>
<select id="StartMonth">
<option value="">Select Month</option>
</select>
这同样适用于ID为"EndYear">和《EndMonth》的<select>
元素。
我想将相同的jQuery函数附加到"起始年"one_answers"结束年":
$('[id$="Year"]').change(function () {
var selectedYear = $(this).val();
var selectedId = $(this).attr('id')
if (selectedYear != null && selectedYear != '') {
$.getJSON('@Url.Action("Months")', { year: selectedYear }, function (months) {
var monthsSelect = $('#StartMonth');
if (selectedId == 'EndYear') {
monthsSelect = $('#EndMonth');
}
monthsSelect.empty();
daysSelect.prepend("<option text='-- select month --' value='' selected='selected'></option>");
$.each(months, function (index, month) {
monthsSelect.append($('<option/>', {
value: month.value,
text: month.text
}));
});
});
}
});
但是,此代码不起作用。我用Bugzilla调试了它,发现这个条件(selectedId == 'EndYear')
破坏了函数。变量selectedId在闭包范围内,但我不知道如何将其带入函数范围内。否则我不知道是什么原因。请记住,如果没有这个条件,代码就可以工作(当然只有#StartMonth)
如果我正确理解您的问题,变量selectedId
可以在$.getJSON
的成功处理程序中访问,但变量的值可能已经被另一个change
事件更改。
例如,如果两个change
事件将在短时间间隔内陈述,例如"#EndYear"one_answers"#StartYear",则可能是以下
change
事件将被触发
selectedId
变量将设置为"EndYear">$.getJSON
change
事件selectedId
变量将设置为"StartYear">$.getJSON
将启动$.getJSON
将完成,selectedId
变量的值将是success
处理程序内部的"StartYear">$.getJSON
将完成,selectedId
变量的值将是success
处理程序内部的"StartYear">所以我认为您只需要有selectedId
变量的不同实例就可以使用$.getJSON
发生之前的值。你可以用不同的方式来实现它。对我来说,将$.getJSON
替换为$.ajax
,并使用$.ajax
的context
参数似乎是最自然的。该代码可能与以下有关
$('[id$="Year"]').change(function () {
var selectedYear = $(this).val();
var selectedId = $(this).attr('id')
if (selectedYear != null && selectedYear != '') {
//$.getJSON('@Url.Action("Months")', {year: selectedYear}, function(months){
$.ajax({
url: '@Url.Action("Months")',
dataType: 'json',
data: { year: selectedYear },
context: {selectedId: selectedId},
success: function (months) {
var selectedId = this.selectedId; // get from context
....
}
});
}
});