0

我必须在(a)之前基于另一个选择框(b)填充一个选择框,我为此使用了更改事件,但是更改事件不断触发,第二个选择框不断填充自己,这样我就无法选择第二个选择框中的一个项目,因为无论我选择什么它都会重新填充自己,我看到在 b 中选择的第一个条目。

$(document).ready(function () {
    $("*:first").change(function () {
        var b = document.forms[0].b;
        var a = document.forms[0].a.value;

        if (a != "") {
            var value = "";
            var par = 'c=' + a;

            $.ajax({
                url: "compute",
                data: par,
                type: "post",
                dataType: "text",
                async: false,
                success: function (data) {
                    value = JSON.decode(data);
                }
            });

            var options = "";

            for (k in value) {
                options = options + "<option value='" + value[k] + "'>" + k + "</option>" + "\n";
            }

            b.innerHTML = options;
        } else {
            b.innerHTML = '<option value="">-Select-</option>';
        }
    });
});
4

1 回答 1

1

问题:您是正确的,:first将匹配集减少到仅第一项;然而*匹配一切,所以*:first实际上选择<html>元素(或您的情况下的其他顶级元素)。.change()不打算与该元素一起使用,因此其默认行为是未定义的——但由于更改事件从您的元素冒泡到顶级<select>元素,似乎每次都在它们上触发它。

解决方案:将您的处理程序绑定到正确的元素。另外,不要发出请求async: false,因为这会导致浏览器挂起,直到服务器响应。相反,将其他代码移动到成功回调中:

$(document).ready(function() {
    var b = $('select:last');
    $("select:first").change(function() {
        var $this = $(this);
        var a = $this.val();

        if (a) {
            var par = 'c=' + a;
            $.ajax({
                url: "compute",
                data: par,
                type: "post",
                dataType: "text",
                //async: false,
                success: function(data) {
                    var value = JSON.decode(data);
                    var options = "";
                    for (k in value)
                        options += "<option value='" + value[k] + "'>" + k + "</option>";

                    b.html(options);
                }
            });
        }
        else {
            b.html('<option value="">-Select-</option>');
        }
    });
});​
于 2012-08-01T05:26:13.617 回答