$("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回调的结果(将其放入选项,全局变量中)粘贴到首先激活事件的对象的同级中。我上面的代码几乎可以成功完成此操作,但是由于回调不会立即发生,因此无法正常工作,因此它在兄弟姐妹中留了空白字符串。在此先感谢您,如果我在这里输入的术语有误,请谅解:)
我认为您正在反向查看它。您可以更轻松地使外部变量可用于内部函数。这是主意:
$("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);
为什么不将$(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);
}
);
}
);
EDIT:添加了备用代码。
JQuery对于ajax有一些问题,主要是当您想“仅在请求完成时”触发函数时。发布,获取,直播等问题。唯一有效的方法是全局$ .ajax,我建议您使用。