1

在一天的大部分时间里,我一直在努力解决以下问题,并且取得的进展绝对为零,所以我想我会伸出手来看看是否有人有一些想法(帮助!!!)。我目前正在将 jQuery 1.7.2 与 IE9 结合使用,并且正在调用一个简单的 $.ajax 调用,它只是检索一些 HTML。随后将 HTML 插入到 div 中,如下所示:

$("#viewContent").html(content);

完整的相关 jQuery 代码如下所示:

var request = $.ajax({
    url: loadUrl, 
    type: "GET", 
    cache: false, 
    data: {command: "loadView", recordid: contextId}, 
    dataType: "html", 
    error: function (xhr, ajaxOptions, thrownError) {
        getViewManager().setMode("ERROR");
        handleError(xhr.status, thrownError);
        $("#viewContent").parent().removeClass("ajaxLoading");  
    }           
});
request.done(onLoadViewSuccess);

var onLoadViewSuccess = function(content) {
    $("#viewContent").parent().removeClass("ajaxLoading");
    for(var i=0;i<100;i++) {
        $("#viewContent").html(content);    
    }               
    content = null;      
}

现在关于这个问题,你会注意到我已经插入了 100 次内容,for 循环只是为了夸大爬升的内存(通过 IE 的 Drip memory profiler 观察到)爬升(以及 DOM 节点的总数由 IE 保留)。内容不是问题,因为我用静态空字符串替换了它,它在 onLoadViewSuccess 函数中做同样的事情:

var onLoadViewSuccess = function(content) {
    $("#viewContent").parent().removeClass("ajaxLoading");
    for(var i=0;i<100;i++) {
        $("#viewContent").html("<div/>");   
    }               
    content = null;      
}

即 Drip 会在每次 ajax 调用后显示 100 个新的 DOM 节点并稳步攀升内存。现在,如果我在初始页面加载时调用相同的方法,为什么这似乎与 ajax 调用有关:

$(document).ready(function() {onLoadViewSuccess("<div/>")});

我没有看到相同的行为(即在 for 循环中调用 html("<div/>") 每次迭代都正确清除了 IE9 中被替换的 DOM 节点,而不是创建 100 个新节点并将它们全部保存在内存中。 .我已经查看了几个报告的 IE 和 jQuery 的 ajax 功能问题,但唯一接近的主题似乎与旧 IE 版本有关,这些问题已在以前版本的 jQuery 中得到解决......

我怀疑我错过了一些基本的东西,因为这似乎是一个微不足道的用例,通常当我无法通过谷歌找到任何类似的主题时,10 次中有 9 次是由于我的愚蠢行为......

4

1 回答 1

0

所以我相信我已经找到了问题的根源......经过痛苦的消除过程,事实证明 IE 没有清理与我定义的特定 CSS 类相关的元素:

.shadow {
border-collapse: separate; 
-moz-box-shadow:    2px 2px 6px 3px #777;
-webkit-box-shadow: 2px 2px 6px 3px #777;   
box-shadow: #666 0px 2px 4px;   
**behavior: url(/btms/resources/css/PIE.htc);**
position: relative;
}

行为值是问题所在(不再使用,但在我最初开发支持 IE 8 的应用程序时无意中留下了 - 具有讽刺意味的是,PIE 旨在为 IE 8 添加 CSS3 支持,但在这种情况下,以某种方式将 IE 9 认可的引用与任何即使在通过 jQuery 删除后,与该类关联的元素也会阻止 IE 释放这些元素资源)。希望这篇文章能拯救其他人同样的痛苦\沮丧......

于 2012-07-09T16:32:31.383 回答