提问者:小点点

我无法设置值或从通过Ajax创建的select元素中获取值


我创建了“Omarkasec”作为一个函数,通过ajax从数据库中获取汽车品牌,并通过ajax在select元素中添加了这个汽车品牌作为选项-->success。但是我不能在这个select元素中设置一个值。

我尝试了设置值的以下代码:

  1. $('select[name=marka]').val('lada');
  2. $('select[name=marka]option[value=lada]').prop('select',true);
  3. $('select[name=marka]option[value=lada]').attr('select','select');

这些密码不管用。但如果我加上alert(“”);在“Omarkasec”函数中,代码起作用,如果我删除alert(“”);密码不起作用。

<div id="marka" class="gizle" >
   Marka: <br>
   <select name="marka" onchange="omodelsec()" size="10" ></select>
</div>

<script language='javascript' type='text/javascript'>
    function omarkasec() {
        $.ajax({
            type: "POST",
            url: "aracsor.php",
            dataType: "json",
            data: {
                otomobilmodelyili : $("select[name=modelyili]").val(), //This work, because i created php.
            },
            success: function(donen){
                $("#marka").removeClass("gizle");
                $("#model").addClass("gizle");
                $("#yakit").addClass("gizle");
                $("#sanziman").addClass("gizle");
                $("#cekis").addClass("gizle");
                $("#kasatipi").addClass("gizle");
                $("select[name=marka]").empty();
                $.each(donen, function (index, otomarka) {
                    $("select[name=marka]").append($("<option>", {
                        text : otomarka,
                        value  : otomarka,
                    }));
                });
            },
        });
     //if I add here alert(""); The following code works.
    }
    </script>

<script language='javascript' type='text/javascript'>
   omarkasec();
   $('select[name=marka]').val('Lada');
   alert($('select[name=marka]').val()); //if I add alert(""); this code work but if I remove alert(""); this code get null value.
</script>

共1个答案

匿名用户

Ajax调用是异步的。您的代码执行$.ajax()调用,并向其传递一个回调函数,但该回调函数并没有在此时执行。

执行过程立即在$.ajax()之后执行语句,但此时内容尚未加载。

但是,如果您执行alert(),则可能会在警报对话框打开时最终触发回调,从而通过回调函数加载内容。如果然后关闭弹出窗口,后面的任何代码都将发现内容在那里。

解决此问题的一种方法是使用$.ajax调用的返回值(这是一个承诺),并将一个then调用链接到它:

function omarkasec(oncomplete) {
    return $.ajax({
//  ^^^^^^
        type: "POST",
        url: "aracsor.php",
        dataType: "json",
        data: {
            otomobilmodelyili : $("select[name=modelyili]").val(),
        },
        success: function(donen){
            $("#marka").removeClass("gizle");
            $("#model").addClass("gizle");
            $("#yakit").addClass("gizle");
            $("#sanziman").addClass("gizle");
            $("#cekis").addClass("gizle");
            $("#kasatipi").addClass("gizle");
            $("select[name=marka]").empty();
            $.each(donen, function (index, otomarka) {
                $("select[name=marka]").append($("<option>", {
                    text : otomarka,
                    value  : otomarka,
                }));
            });
        },
    });
}

// provide (anonymous) callback function to the `then` method: 
omarkasec.then(function () {
     // this code will only be executed when content is loaded:
     $('select[name=marka]').val('Lada');
     alert($('select[name=marka]').val());
});