0

(a) の前に別の選択ボックス (b) に基づいて 1 つの選択ボックスにデータを入力する必要があります。これには変更イベントを使用しましたが、変更イベントが発生し続け、2 番目の選択ボックスにデータが入力され続け、この方法では選択できません。 2 番目の選択ボックスの項目。選択したものは何でも自動的に再入力され、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また、サーバーが応答するまでブラウザがハングするため、 request を作成しないでください。代わりに、他のコードを成功のコールバックに移動します。

$(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 に答える