jQuery Ajax .html()就绪请求

时间:2012-03-17 14:08:29

标签: javascript ajax json jquery

我使用Jquery Ajax加载内容并使用.html()方法将其插入到div中。之后我需要获取加载内容的高度来计算更多大小,但似乎内容最终没有被加载。当我试图获得它的高度它有时工作正常,但另一次我得到一个小高度值。

Ajax加载函数:

function loadPage(url,data){
    jQuery.ajax({
        'url': url,
        'dataType': 'json',
        'data': data,
        success: function(data,s,xhdr){ // data, status
                        if(!data){ return false };
            pagenav(data);
        }
    });
    return false;}

function pagenav(data){
    if(!data){ return false };
    if(typeof(data.content)=="object"){
        for(var i in data.content){
            if(data.content[i].target_id == 'panelMain'){
                        jQuery('#panelMain').html(data.content[0].content);
                            setTimeout(function(){ 
                                onLoad();
                            },0);

            }else{
                jQuery('#panelFooter').html(data.content[1].content);
            }
        }
    }
    }

onLoad函数处理整个高度的事情。我试图在操作新元素之前使用setTimeout方法完全填充DOM。将超时设置为更大的值(比方说500)对我来说很好,但是我认为这不是正确的方法。

提前致谢

1 个答案:

答案 0 :(得分:0)

您的代码存在一些问题,我可以看到它......

首先,当数据评估为false时,您在pagenav()中返回一些内容,这与您在ajax成功回调中已经执行的操作相同。

其次,您通过data.content将密钥放入变量i。在该for循环中,检查data.content中的当前密钥是否具有等于'panelMain'的属性target_id。如果这是真的,你会以某种方式假设w / e进入面板main将在data.content[0] =>我相信这应该是data.content[i]没有?

您的onLoad()调用位于for循环中,因此可能会多次调用或在for循环结束之前调用....

以下是我认为你想做的事情:

function loadPage(url, data) {
    jQuery.ajax({
        'url': url,
        'dataType': 'json',
        'data': data,
        success: function(data, s, xhdr) { // data, status
            if (!data) {
                return false
            };

            pagenav(data);
        }
    });
    return false; // mind you this function will always return false since ajax calls are async
}

function pagenav(data) {
    if (typeof(data.content) == "object") {
        for (var i in data.content) {
            jQuery('#' + data.content[i].target_id).html(data.content[i].content);
        }

        onLoad();
    }
}