используя заполненный элемент xml из ajax - PullRequest
0 голосов
/ 05 января 2010

Я создал объект javascript и связанный метод, который выглядит очень похоже на это. «getUserInfo» выполняется в $ (). ready (function () {}

function userObject(userId)
{
    this.userId = userId;

    this.getUserMachineList = function(infoId, machineListId)
    {
        jQuery.post(machDBPHPPath + "/listAllUserMachineAccess.php",
            { userId : this.userId, sid : Math.random() },
            function(xmlDoc)
            {
                var userMachineListXml = document.createElement("xml");
                //populate serialized xml in dom element here
            }
    });
}

Я пытаюсь прочитать содержимое заполненного элемента xml в populatePage (), см. Ниже.

Проблема в том (я уверен, что многие из вас видели это раньше) в том, что элемент xml, созданный getUserInfo, не существует, когда я вызываю populateUserPage, который выполняет дополнительные вызовы ajax на основе информации в этом xml. элемент.

$().ready(function()
{
    //create sessionUser here..
    sessionUser.getUserMachineList(USER_MACHINE_INFO_ID, USER_MACHINE_XML_ID);
    populatePage();
});

Я использовал setTimeout с populatePage, как обходной путь в прошлом, но мне это не нравится - это хак, и он не всегда работает.

В идеале, есть какой-то метод ожидания появления этого идентификатора в DOM, о котором я не знаю, что было бы замечательно, но пока не найдено ..

Или это может быть общим недостатком веб-дизайна, и мне следует перепроектировать мой код на стороне сервера, чтобы учесть эту асинхронность?

Спасибо за вашу помощь ..

-Larry

1 Ответ

0 голосов
/ 05 января 2010

Идея сохранения моего кода вне функции обратного вызова ajax функции getUserMachineList состояла в том, чтобы сохранить этот код универсальным для других страниц с различными doms / форматами / целями. Решение оказалось простым - я использую «eval» в обратном вызове getUserMachineList и принимаю в качестве аргумента getUserMachineList конкретную функцию, которую хочу использовать для заполнения этой страницы - «populatePage». Вот код:

//from a global js file
this.getUserMachineList = function(infoId, machineListId, jsCmd, jsArg)
{
    jQuery.post(machDBPHPPath + "/listAllUserMachineAccess.php",
        { userId : this.userId, sid : Math.random() },
        function(xmlDoc)
        {
           var userMachineListXml = document.createElement("xml");
           //populate serialized xml to element

           //do page specific stuff here, after my xml element is populated
           eval(jsCmd + "(\"" + jsArg + "\")");
        });
}

//from my page specific js file, loaded after the above code. the function 
//"populatePage" takes this serialized xml created by getUserMachineList and
//populates my page appropriately
$().ready(function()
{
    sessionUser = new userObject(getUserIdFromCookie());
    sessionUser.getUserMachineList(USER_MACHINE_INFO_ID, USER_MACHINE_XML_ID,
       "populatePage","");
});

Похоже, вы можете связать воедино функции в обратном вызове с этим шаблоном. Не идеально, но нравится намного лучше, чем взлом setTimeout ..

большое спасибо, и хорошо быть на шоу-

-Larry

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