我正在尝试将相同的 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>
元素。
我想在“Start Year”和“End Year”中附加相同的jQuery函数:
$('[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)
答案 0 :(得分:2)
如果我正确理解了您的问题,可以在selectedId
的成功处理程序中访问变量$.getJSON
,但变量的值可能已被另一个change
事件更改。
例如,如果两个change
事件将在短时间间隔内声明,例如“#EndYear”和“#StartYear”,那么可能是以下
change
将触发“#EndYear”事件selectedId
变量将设置为“EndYear”$.getJSON
将启动change
将触发“#StartYear”事件selectedId
变量将设置为“StartYear”$.getJSON
$.getJSON
将完成,selectedId
变量的值将是success
处理程序中的“StartYear”$.getJSON
将完成,selectedId
变量的值将是success
处理程序中的“StartYear”所以我认为您只需要使用selectedId
变量的不同实例来使用$.getJSON
之前的值。您可以以不同的方式实现它。对于我来说,将$.getJSON
替换为$.ajax
并使用context
的{{1}}参数似乎是最本土的。代码可以是以下
$.ajax