【问题标题】:jQuery Ajax .html() ready requestjQuery Ajax .html() 就绪请求
【发布时间】:2012-03-17 14:08:28
【问题描述】:

我使用 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)对我来说很好,但我猜这不是正确的方法。

提前致谢

【问题讨论】:

  • 尝试在for循环之后调用onLoad();

标签: javascript ajax json jquery


【解决方案1】:

您的代码有几个问题,我可以看到...

首先,当数据评估为 false 时,您在 pagenav() 中返回一些内容,这与您在 ajax 成功回调中所做的检查相同。

其次,您遍历data.content,将键放入变量i。在那个 for 循环中,您检查data.content 中的当前键是否具有等于“panelMain”的属性target_id。如果这是真的,您会以某种方式假设 w/e 进入面板主将在 data.content[0] => 我相信这应该是 data.content[i] 否?

您的 onLoad() 调用在 for 循环中,因此 in 可能会被多次调用或在 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();
    }
}

【讨论】:

  • 如果您不在其他地方重用 pagenav(我认为看到它只处理 ajax 调用的返回而仅此而已),您应该将代码放入loadPage 函数中的成功回调。
  • 感谢回复。是的,它应该是 [i],我只是为了测试而改变了它。原因 [i] 在我的情况下只能是 0 或 1,0 将始终是 panelMain,因为 1 将始终是 panelFooter,onLoad 不能被多次触发。将 onLoad 函数移出循环甚至使用您的完整函数,会导致更大的高度问题。我建议我的 onLoad 函数可能出现故障!但就像我说的有点超时它工作,这意味着它不是。对吗?
猜你喜欢
  • 2017-08-12
  • 1970-01-01
  • 2020-08-03
  • 2012-12-14
  • 1970-01-01
  • 2012-02-15
  • 2011-07-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多