$("select[name=field[]]").live("change", function() {
$.getJSON("/json.php",{id: $(this).val(), ajax: 'true'}, function(j){
options = '';
for (var i = 0; i < j.length; i++) {
options += '<option value="' + j[i].optionValue + '">' + j[i].optionDisplay + '</option>';
}
});
$(this).siblings("[name=logic[]]").html(options);
});
所以,我想把json回调的结果(它放在选项中,一个全局变量)粘贴到首先激活事件的对象的兄弟中。我上面的代码几乎成功了,但是不能正常工作,因为回调不会立即发生,因此它会在兄弟中添加一个空白字符串。如果我在那里有任何错误的话,请提前致谢并抱歉:)
答案 0 :(得分:2)
我认为你正在向后看。您可以更轻松地使外部变量可用于内部函数。这是个主意:
$("select[name=field[]]").live("change", function() {
var theSelect = $(this);
$.getJSON("/json.php",{id: $(this).val(), ajax: 'true'}, function(j){
options = '';
for (var i = 0; i < j.length; i++) {
options += '<option value="' + j[i].optionValue + '">' + j[i].optionDisplay + '</option>';
}
theSelect.siblings("[name=logic[]]").html(options);
});
});
我也有顾虑。您似乎正在尝试将选项添加到触发事件的选择中。他们是孩子,而不是兄弟姐妹。他们拥有它,这将为每个选择添加选项,这些选择是事件源的兄弟。如果我的假设是正确的,你可以在你的内部for循环中做这样的事情,而不是构建一个巨大的HTML字符串:
$('<option>blah blah</option>').appendTo(theSelect);
答案 1 :(得分:1)
为什么不将$(this).siblings("[name=logic[]]").html(options);
行放在回调本身中?最好的地方似乎是在for循环完成后立即。
$("select[name=field[]]")
.live
(
"change",
function() {
var selectElem = $(this);
$.getJSON
(
"/json.php",
{id: $(this).val(), ajax: 'true'},
function(j) {
options = '';
for (var i = 0; i < j.length; i++) {
options += '<option value="' +
j[i].optionValue + '">' +
j[i].optionDisplay +
'</option>';
}
selectElem.siblings("[name=logic[]]").html(options);
}
);
}
);
编辑:添加了替代代码。
答案 2 :(得分:0)
JQuery在ajax方面存在一些问题,主要是当你想“仅在请求完成时”触发函数时。发布,获取,生活等,有这些问题。唯一一个正常工作的是全球$ .ajax,我建议你使用它。