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

时间:2016-05-01 17:03:50

标签: javascript jquery ajax setvalue

我创建了" omarkasec"作为一个功能,我从数据库通过ajax获得汽车品牌,我在选择元素添加这个汽车品牌作为选项通过ajax - >成功。 但是我无法为这个选择元素设置一个值。

我尝试使用此代码设置值:

  1. $('选择[名称=马尔卡]&#39)。VAL('拉达&#39);
  2. $('选择[name = marka]选项[value = Lada]')。prop(' selected',true);
  3. $('选择[name = marka]选项[value = Lada]')。attr('选择','选择');
  4. 这些代码不起作用。但是如果我添加警报(""); in" omarkasec"函数代码是否有效,如果我删除警报("");代码不起作用。

    <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>
    

2 个答案:

答案 0 :(得分:1)

你有竞争条件。您正在调用omarkasec()而不是等待它完成执行select.val()操作。当你添加警报它“工作”,因为它给代码一些额外的时间来完成ajax调用填充值。当您提醒它时,值已经填满。

依赖于ajax调用结果的所有代码都必须在成功回调中。

答案 1 :(得分: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());
});