как узнать, когда DOM снова готов после добавления узла из ajax - PullRequest
1 голос
/ 10 октября 2011

Я получаю JSON-файл через ajax и добавляю его в свой DOM (см .: как читать информацию из ajax-dialogbox )

Теперь я хотел получить доступ к этому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, но единственное, что сработало, было простое предупреждение («wait»);но я не могу жить с этим решением, потому что я не хочу, чтобы пользователь нажимал 20 раз: P

есть идеи?

Спасибо!:)

Редактировать:

вот код:

function combobox_by_name(ID_of_name){
  return $('select[name=audience\\[' + ID_of_name + '\\]\\[value\\]] option:selected').text();
}

и вызов ajax, который я делаю прямо перед предупреждением со вставкой HTML-узла:

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);
    }


});

}

Ответы [ 2 ]

1 голос
/ 10 октября 2011

Используйте функцию обратного вызова.

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);
    }


});

}

Тогда:

get_ajax_dialogwindow(function(){
   alert("Test Combo" + combobox_by_name(value.ID_of_name));
});
0 голосов
/ 10 октября 2011

Я почти уверен, что это из-за асинхронного вызова ajax. Вы пытаетесь получить доступ к переменной, которая еще не установлена.

Если вы поставили предупреждение перед фактическим доступом, нажмите кнопку ОК, чтобы завершить вызов. Когда код переходит на следующую строку, он работает, как и ожидалось, поскольку значение установлено.

Вы должны установить свою переменную / сделать что-то с ней в функции обратного вызова. Поскольку вы не опубликовали ни один из ваших реальных кодов, я импровизирую:

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));
},

Вы также можете посмотреть на getJSON метод, так как это сокращение, я думаю, вы найдете полезным в вашем случае. Он возвращает фактические данные в формате JSON, поэтому вам не нужно выполнять анализ черной магии.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...