0

我正在尝试将相同的jQueryJSON 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 函数附加到“开始年份”和“结束年份”:

$('[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)

4

1 回答 1

2

如果我正确理解您的问题,selectedId则可以在 的成功处理程序中访问该变量$.getJSON,但该变量的值可能已经被另一个change事件更改。

例如,如果两个change事件将在例如“#EndYear”和“#StartYear”的短时间间隔内陈述,则可能如下

  1. change“#EndYear”的事件将被触发
  2. selectedId变量将设置为“EndYear”
  3. 首先$.getJSON将开始
  4. change“#StartYear”的事件将被触发
  5. selectedId变量将设置为“StartYear”
  6. 第二个$.getJSON将开始
  7. 首先$.getJSON将完成,变量的值将是处理程序selectedId内的“StartYear”success
  8. 第二个$.getJSON将完成,变量的值将是处理程序selectedId内的“StartYear”success

所以我认为你只需要有不同的变量实例selectedId来使用发生之前的值$.getJSON。您可以以不同的方式实现它。$.getJSON对我来说,替换和$.ajax使用context参数似乎是最原生的$.ajax。该代码可能是关于以下

$('[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
                ....
            }
        });
    }
});
于 2012-10-29T23:55:14.370 回答