我无法设置值或从通过 Ajax 创建的 select 元素获取值
I can't set value or get value from select elements created via Ajax
我创建了 "omarkasec" 作为函数,我通过 ajax 从数据库中获取汽车品牌,我通过 ajax 在 select 元素中添加了这个汽车品牌作为选项--> 成功。
但是我无法为此 select 元素设置值。
我尝试使用此代码设置值:
- $('select[name=marka]').val('Lada');
- $('select[name=marka] option[value=Lada]').prop('selected', true);
- $('select[name=marka] option[value=Lada]').attr('selected', 'selected');
此代码无效。但是如果我添加 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>
您有竞争条件。您正在调用 omarkasec() 而不是等待它完成执行 select.val() 操作。当您添加警报时,它 "works" 因为它为代码提供了一些额外的时间来完成 ajax 调用并填充值。当您提醒它时,值已经填满。
所有依赖于 ajax 调用结果的代码都必须在成功回调中。
Ajax 调用是异步的。您的代码执行 $.ajax()
调用并向其传递一个回调函数,但该回调函数并未在那一刻执行。
立即执行$.ajax()
之后的语句,但此时内容尚未加载。
但是,如果您执行 alert()
,回调可能最终会在警报对话框打开时被触发,因此您的回调函数会加载内容。如果您随后关闭弹出窗口,它后面的任何代码都会找到内容。
解决这个问题的一种方法是使用 $.ajax
调用的 return 值,这是一个承诺,并将一个 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());
});
我创建了 "omarkasec" 作为函数,我通过 ajax 从数据库中获取汽车品牌,我通过 ajax 在 select 元素中添加了这个汽车品牌作为选项--> 成功。 但是我无法为此 select 元素设置值。
我尝试使用此代码设置值:
- $('select[name=marka]').val('Lada');
- $('select[name=marka] option[value=Lada]').prop('selected', true);
- $('select[name=marka] option[value=Lada]').attr('selected', 'selected');
此代码无效。但是如果我添加 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>
您有竞争条件。您正在调用 omarkasec() 而不是等待它完成执行 select.val() 操作。当您添加警报时,它 "works" 因为它为代码提供了一些额外的时间来完成 ajax 调用并填充值。当您提醒它时,值已经填满。
所有依赖于 ajax 调用结果的代码都必须在成功回调中。
Ajax 调用是异步的。您的代码执行 $.ajax()
调用并向其传递一个回调函数,但该回调函数并未在那一刻执行。
立即执行$.ajax()
之后的语句,但此时内容尚未加载。
但是,如果您执行 alert()
,回调可能最终会在警报对话框打开时被触发,因此您的回调函数会加载内容。如果您随后关闭弹出窗口,它后面的任何代码都会找到内容。
解决这个问题的一种方法是使用 $.ajax
调用的 return 值,这是一个承诺,并将一个 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());
});