Javascript 从ajax添加节点后,如何知道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

我通过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_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()
我只会得到空的空间…这是可行的。它破坏了我的建筑,但它起了作用。谢谢:)您应该将回调合并到您的体系结构中,这是一种强大的模式,对于异步编程来说是必需的。解决异步问题的其他模式不那么干净,而且更加模糊。是的,当不加区分地编写回调代码时,您可能会陷入回调地狱,只是要聪明一点,我相信您会成功的;)这是有效的。它破坏了我的建筑,但它起了作用。谢谢:)您应该将回调合并到您的体系结构中,这是一种强大的模式,对于异步编程来说是必需的。解决异步问题的其他模式不那么干净,而且更加模糊。是的,当不加区分地编写回调代码时,您可能会陷入回调地狱,只是要聪明一点,我相信您会成功的;)