我有这段代码http://jsfiddle.net/meridius/ysDGm/,问题出在out.id
部分的append
变量中。由于我无法解释的原因,该部分中的变量是空的。
我认为问题在于变量的范围,我尝试了一切,但没有运气。 请注意,问题不在于AJAX,这很好用!
以下是该小提琴的缩短版本:
<tr>
<td>one</td>
<td>
<select name="zadavatel">
<option value="0">-- vyberte --</option>
<option value="new">-- nový zadavatel --</option>
</select>
</td>
</tr>
var out = {};
$('select').bind("change", function() {
if ($(this).val() == "new") {
var nazev = prompt('Question',
$(this).parent().siblings(':first-child').text());
if (nazev == null) {
$(this).val($.data(this, 'current'));
return false;
} else {
var pole2 = {};
pole2["nazev"] = nazev;
$.ajax({
type : "POST",
cache : false,
url : "./pokus_zad.php",
data : JSON.stringify(pole2),
success : function(data) {
out = JSON.parse(data); //data.id
}
});
out.id = 15; // this work, but it SHOULD work without it (with AJAX)
$(this).closest('table').find('select').each(
function() {
$(this).append($('<option>', { "value" : out.id }).text(nazev));
});
$(this).closest('select').val(out.id).attr('selected', 'selected');
}
}
$.data(this, 'current', $(this).val());
});
答案 0 :(得分:0)
AJAX是异步的,因此在函数的其余部分之后将发生out
变量的设置。
$.ajax({
type : "POST",
cache : false,
url : "./pokus_zad.php",
data : JSON.stringify(pole2),
success : function(data) {
out = JSON.parse(data); //data.id
$(this).closest('table').find('select').each(
function() {
$(this).append($('<option>', { "value" : out.id }).text(nazev));
});
$(this).closest('select').val(out.id).attr('selected', 'selected');
}
});
答案 1 :(得分:0)
您应该将附加代码放在成功块中。因为ajax调用是异步的,所以append语句在ajax回调设置'out'变量之前运行。
var out = {};
$('select').bind("change", function() {
if ($(this).val() == "new") {
var nazev = prompt('Question',
$(this).parent().siblings(':first-child').text());
if (nazev == null) {
$(this).val($.data(this, 'current'));
return false;
} else {
var pole2 = {};
pole2["nazev"] = nazev;
$.ajax({
type : "POST",
cache : false,
url : "./pokus_zad.php",
data : JSON.stringify(pole2),
success : function(data) {
out = JSON.parse(data); //data.id
$(this).closest('table').find('select').each(
function() {
$(this).append($('<option>', { "value" : out.id }).text(nazev));
});
$(this).closest('select').val(out.id).attr('selected', 'selected');
}
});
}
}
$.data(this, 'current', $(this).val());
});
答案 2 :(得分:0)
太好了,谢谢你们!
根据你的建议,我将追加代码移动到成功回调AJAX函数 AND 我还必须为$(this)创建变量,因为它在AJAX中与$(this)不同而不是它外。 ;)
现在,正在运行的JQuery部分如下所示:
var out = {};
$('select').bind("change", function() {
if ($(this).val() == "new") {
var nazev = prompt('Zadejte název zadavatele', $(this).parent().siblings(':first-child').text());
if (nazev == null) {
$(this).val($.data(this, 'current'));
return false;
} else {
var select = $(this);
var pole2 = {};
pole2["nazev"] = nazev;
$.ajax({
type : "POST",
cache : false,
url : "./pokus_zad.php",
data : JSON.stringify(pole2),
success : function(data) {
out = JSON.parse(data); //data.id
select.closest('table').find('select').each(
function() {
$(this).append($('<option>', { "value" : out.id }).text(nazev));
});
select.val(out.id).attr('selected', 'selected');
}
});
}
}
$.data(this, 'current', $(this).val());
});