使用来自ajax的填充xml元素

时间:2010-01-04 23:57:20

标签: javascript ajax

我创建了一个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
            }
    });
}

我试图在populatePage()中读取填充的xml元素的内容,见下文。

问题是(我相信很多人以前见过这个),当我调用populateUserPage时,“getUserInfo”创建的xml元素是不存在的,这是基于此xml中的信息进行进一步的ajax调用元件。

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

我已经将setTimeout与populatePage一起使用,作为过去的解决方法,但不喜欢这个 - 这是一个黑客,并不总是有效。

理想情况下,有一些方法可以等待这个id存在于我不知道的DOM中,这会很棒,但还没有找到...

或者这可能是一般的网页设计缺陷,我应该重新设计我的服务器端代码以考虑这种异步性?

感谢您的帮助..

-Larry

1 个答案:

答案 0 :(得分:0)

将我的代码保留在函数getUserMachineList的ajax回调之后的想法是将此代码保持为其他页面的通用,具有不同的doms /格式/目的。解决方案最终变得简单 - 我在getUserMachineList的回调中使用“eval”,并将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