Javascript 从ajax添加节点后,如何知道DOM何时准备就绪
我通过ajax接收JSON文件,并将其添加到我的DOM中(请参阅: ) 现在我想访问这个DOM节点,但唯一可行的方法是:Javascript 从ajax添加节点后,如何知道DOM何时准备就绪,javascript,jquery,dom,Javascript,Jquery,Dom,我通过ajax接收JSON文件,并将其添加到我的DOM中(请参阅: ) 现在我想访问这个DOM节点,但唯一可行的方法是: get_ajax_dialogwindow(); alert("wait for click"); alert("Test Combo" + combobox_by_name(value.ID_of_name)); 这非常好,但我不希望用户先单击。只要我试一下 get_ajax_dialogwindow(); alert("Test Combo" + combobox_by
get_ajax_dialogwindow();
alert("wait for click");
alert("Test Combo" + combobox_by_name(value.ID_of_name));
这非常好,但我不希望用户先单击。只要我试一下
get_ajax_dialogwindow();
alert("Test Combo" + combobox_by_name(value.ID_of_name));
我只在数据应该在的地方得到空白。。。我猜是因为DOM还没准备好。我尝试了$(document).ready、setTimeout、.delay()、ajax.stop、DOMContentReady,但唯一有效的方法是一个简单的警报(“等待”);但我不能接受这种解决方案,因为我不希望用户点击20次:P
有什么想法吗
谢谢!:)
编辑:
代码如下:
function combobox_by_name(ID_of_name){
return $('select[name=audience\\[' + ID_of_name + '\\]\\[value\\]] option:selected').text();
}
我在警报之前通过插入HTML节点进行的ajax调用:
function get_ajax_dialogwindow(){
var data = '__a=1&__d=1&__user='+get_userID(); //Parameter für den Ajax Aufruf. Bestehend aus __a=1, __d=1 und der UserID
var json;
$.ajax({
type:"GET",
url: get_ajax_url(), //url für empfänger des Ajax Aufrufs. Lässt sich mit Firebug herausfinden, wenn man den link der das Dialogfenster öffnet analysiert
data: data,
dataType: "text", //eigentlich ist es json und kein text, allerdings gibt es einen Schutz von Facebook,
//der die Dauerschleife for(;;;) vorne heranschiebt. Deshalb wird es als Text betrachtet
success: function(response) {
response = response.replace(/.*?;{/, "{"); //Entfernt for(;;;)
jsonFile = JSON.parse(response); //Parsed den Text in ein Json file
$('#globalContainer').append(jsonFile.payload.body.__html); //Fügt das Dialogfenster ganz unten an die Seite hinzu
},
error: function(xhr) { //Fehlermeldung, falls der Ajax aufruf fehlschlägt
alert('Error! Status = ' + xhr.status);
alert(xhr.responseText);
}
});
}
我很确定这是因为异步ajax调用。您正在尝试访问尚未设置的变量 如果您在实际访问之前发出警报,则单击“确定”按钮需要一些时间,因此呼叫正在完成。当代码转到下一行时,它会按预期工作,因为该值已设置 您应该在coalback函数中设置变量/使用它做一些事情。由于您没有发布任何实际代码,我将即兴创作:
var yourVar;
$.get("someurl", params, function (data) {
yourVar = data; // Let's say that you set it right here
alert(yourVar); // will work perfectly
});
alert(yourVar); // Possibly won't work because it will most likely be called before the get is completed
编辑:在你发布代码之前,我已经写完了这个答案。看起来情况确实如此,但我会更深入地调查以证实这一点
success: function(response) {
response = response.replace(/.*?;{/, "{"); //Entfernt for(;;;)
jsonFile = JSON.parse(response); //Parsed den Text in ein Json file
$('#globalContainer').append(jsonFile.payload.body.__html); //Fügt das Dialogfenster ganz unten an die Seite hinzu
// Here it should work
alert("Test Combo" + combobox_by_name(value.ID_of_name));
},
你们也可以研究这个方法,因为它是一个速记,我想你们会发现它在你们的案例中很有用。它返回实际的JSON数据,因此您不需要执行任何黑魔法解析。我很确定这是因为异步ajax调用。您正在尝试访问尚未设置的变量 如果您在实际访问之前发出警报,则单击“确定”按钮需要一些时间,因此呼叫正在完成。当代码转到下一行时,它会按预期工作,因为该值已设置 您应该在coalback函数中设置变量/使用它做一些事情。由于您没有发布任何实际代码,我将即兴创作:
var yourVar;
$.get("someurl", params, function (data) {
yourVar = data; // Let's say that you set it right here
alert(yourVar); // will work perfectly
});
alert(yourVar); // Possibly won't work because it will most likely be called before the get is completed
编辑:在你发布代码之前,我已经写完了这个答案。看起来情况确实如此,但我会更深入地调查以证实这一点
success: function(response) {
response = response.replace(/.*?;{/, "{"); //Entfernt for(;;;)
jsonFile = JSON.parse(response); //Parsed den Text in ein Json file
$('#globalContainer').append(jsonFile.payload.body.__html); //Fügt das Dialogfenster ganz unten an die Seite hinzu
// Here it should work
alert("Test Combo" + combobox_by_name(value.ID_of_name));
},
你们也可以研究这个方法,因为它是一个速记,我想你们会发现它在你们的案例中很有用。它返回实际的JSON数据,因此您无需执行任何黑魔法解析。使用回调函数
function get_ajax_dialogwindow( CALLBACK ){
var data = '__a=1&__d=1&__user='+get_userID(); //Parameter für den Ajax Aufruf. Bestehend aus __a=1, __d=1 und der UserID
var json;
$.ajax({
type:"GET",
url: get_ajax_url(), //url für empfänger des Ajax Aufrufs. Lässt sich mit Firebug herausfinden, wenn man den link der das Dialogfenster öffnet analysiert
data: data,
dataType: "text", //eigentlich ist es json und kein text, allerdings gibt es einen Schutz von Facebook,
//der die Dauerschleife for(;;;) vorne heranschiebt. Deshalb wird es als Text betrachtet
success: function(response) {
response = response.replace(/.*?;{/, "{"); //Entfernt for(;;;)
jsonFile = JSON.parse(response); //Parsed den Text in ein Json file
$('#globalContainer').append(jsonFile.payload.body.__html); //Fügt das Dialogfenster ganz unten an die Seite hinzu
if ( CALLBACK ) CALLBACK();
},
error: function(xhr) { //Fehlermeldung, falls der Ajax aufruf fehlschlägt
alert('Error! Status = ' + xhr.status);
alert(xhr.responseText);
}
});
}
然后:
使用回调函数
function get_ajax_dialogwindow( CALLBACK ){
var data = '__a=1&__d=1&__user='+get_userID(); //Parameter für den Ajax Aufruf. Bestehend aus __a=1, __d=1 und der UserID
var json;
$.ajax({
type:"GET",
url: get_ajax_url(), //url für empfänger des Ajax Aufrufs. Lässt sich mit Firebug herausfinden, wenn man den link der das Dialogfenster öffnet analysiert
data: data,
dataType: "text", //eigentlich ist es json und kein text, allerdings gibt es einen Schutz von Facebook,
//der die Dauerschleife for(;;;) vorne heranschiebt. Deshalb wird es als Text betrachtet
success: function(response) {
response = response.replace(/.*?;{/, "{"); //Entfernt for(;;;)
jsonFile = JSON.parse(response); //Parsed den Text in ein Json file
$('#globalContainer').append(jsonFile.payload.body.__html); //Fügt das Dialogfenster ganz unten an die Seite hinzu
if ( CALLBACK ) CALLBACK();
},
error: function(xhr) { //Fehlermeldung, falls der Ajax aufruf fehlschlägt
alert('Error! Status = ' + xhr.status);
alert(xhr.responseText);
}
});
}
然后:
请给我们看有问题的代码。你把警报放在哪里了?在成功处理器内部?您如何添加到DOM?DOM只能准备一次,之后它将始终准备就绪。请向我们展示有问题的代码。您将该警报放在了哪里?在成功处理器内部?如何添加到DOM中?DOM只能准备一次,之后总是准备就绪。这也不起作用。我想把它放在另一个函数中,就像我现在所做的一样,你可以把它放在另一个函数中,或者任何你想要的函数中。您只需确保在ajax调用完成后尝试访问该元素。由于它不起作用(我发现这很不可能),您是否使用firebug?如果是这样,当您将
console.log()
替换为alert()
时,它会产生什么结果?console.log()
的工作方式相同。如果我在它前面放置了一个警报(“wait”)
,那么它就可以正常工作。如果我只使用console.log()
我只会得到空的空间…这也不起作用。我想把它放在另一个函数中,就像我现在所做的一样,你可以把它放在另一个函数中,或者任何你想要的函数中。您只需确保在ajax调用完成后尝试访问该元素。由于它不起作用(我发现这很不可能),您是否使用firebug?如果是这样,当您将console.log()
替换为alert()
时,它会产生什么结果?console.log()
的工作方式相同。如果我在它前面放置了一个警报(“wait”)
,那么它就可以正常工作。如果我只使用console.log()
我只会得到空的空间…这是可行的。它破坏了我的建筑,但它起了作用。谢谢:)您应该将回调合并到您的体系结构中,这是一种强大的模式,对于异步编程来说是必需的。解决异步问题的其他模式不那么干净,而且更加模糊。是的,当不加区分地编写回调代码时,您可能会陷入回调地狱,只是要聪明一点,我相信您会成功的;)这是有效的。它破坏了我的建筑,但它起了作用。谢谢:)您应该将回调合并到您的体系结构中,这是一种强大的模式,对于异步编程来说是必需的。解决异步问题的其他模式不那么干净,而且更加模糊。是的,当不加区分地编写回调代码时,您可能会陷入回调地狱,只是要聪明一点,我相信您会成功的;)