html - jQuery 手机 : Dynamically loaded content bloating the DOM

标签 html caching dom jquery-mobile

TLDR:通过 AJAX 将弹出组件注入(inject)然后替换到 div 会导致 jQM 在 div 之外插入自己的覆盖元素而不删除它们。

我有一个 jQM 网页,它在 ajax 调用成功时动态加载 div 标签的内容:

$("#contentPane").html(data).trigger("create");

ajax 调用可以进行多次,每次都会替换 div 的先前内容。加载的内容各不相同:它们可能与之前的内容具有相同的组件,或者它们可能完全不同。

我注意到的是,如果我注入(inject)的内容包含从页面“弹出”的 UI 组件(例如一个对话框,或者一个带有 data-native-menu = "false") JQM 将覆盖元素直接插入正文标记或事件页面标记中,在我的事件页面的主要内容 div 之外。

例如:

<body>
    ...
    <div class="ui-page ui-body-b ui-page-header-fixed ui-page-active" position="fixed" data-theme="b" data-role="page">
        <div id="contentHeader" class="ui-header ui-bar-b ui-header-fixed slidedown" data-theme="b" data-position="fixed" data-role="header" role="banner">...</div>
        <div id="contentPane" class="ui-content ui-body-b" data-theme="b" data-role="content" role="main">...</div>
        <div class="ui-selectmenu ui-overlay-shadow ui-corner-all ui-body-a pop ui-selectmenu-hidden">...</div>
        <div class="ui-selectmenu-screen ui-screen-hidden"></div>
    </div>
    ...
    <div class="ui-page ui-body-c ui-dialog ui-overlay-a" data-overlay-theme="a" data-theme="c" data-role="dialog" tabindex="0" style="min-height: 399px;">
</body>

问题是每当我替换“contentPane”div 的内容时,这些覆盖元素都会保留在 DOM 中。如果我注入(inject)的新内容也需要覆盖元素,JQM 会创建新内容而不删除陈旧的元素。所以最终我的 DOM 看起来像这样:

<div class="ui-page ui-body-b ui-page-header-fixed ui-page-active" position="fixed" data-theme="b" data-role="page">
    <div id="contentHeader" class="ui-header ui-bar-b ui-header-fixed slidedown" data-theme="b" data-position="fixed" data-role="header" role="banner">...</div>
    <div id="contentPane" class="ui-content ui-body-b" data-theme="b" data-role="content" role="main">...</div>
    <div class="ui-selectmenu-screen ui-screen-hidden" style="height: 3150px;"></div>
    <div class="ui-selectmenu ui-overlay-shadow ui-corner-all ui-body-a pop ui-selectmenu-hidden">...</div>
    <div class="ui-selectmenu-screen ui-screen-hidden"></div>
    <div class="ui-selectmenu ui-selectmenu-hidden ui-overlay-shadow ui-corner-all ui-body-a pop">...</div>
    <div class="ui-selectmenu-screen ui-screen-hidden"></div>
    <div class="ui-selectmenu ui-selectmenu-hidden ui-overlay-shadow ui-corner-all ui-body-a pop">...</div>
    <div class="ui-selectmenu-screen ui-screen-hidden"></div>
    <div class="ui-selectmenu ui-selectmenu-hidden ui-overlay-shadow ui-corner-all ui-body-a pop">...</div>
    <div class="ui-selectmenu-screen ui-screen-hidden"></div>
    <div class="ui-selectmenu ui-selectmenu-hidden ui-overlay-shadow ui-corner-all ui-body-a pop">...</div>
</div>

现在这不是一个大问题,因为它不会破坏任何功能,但鉴于这是一个移动应用程序,膨胀的 DOM 如果失控会导致性能下降。

我想知道是否有某种方法可以告诉 JQM 清理任何这些陈旧的 DOM 元素,或者是否有一种方法可以让我自己检查这些覆盖是否已经过时,比如使用$(".ui-overlay-shadow, .ui-overlay-a") 然后检查一些属性。

最佳答案

您可以将注入(inject)到页面中的元素保存到一个变量中,然后使用 jQuery 中的 .remove() 运算符,Documentation .

var injectedDomElement = ...;
$(document).one("pagehide", function(){
    injectedDomElement.remove();
}

关于html - jQuery 手机 : Dynamically loaded content bloating the DOM,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11580998/

相关文章:

javascript - 将 Golang 变量传递到 Javascript

javascript - jQuery fadeIn() 没有给出我想要的结果

javascript - 虽然 Javascript 中的循环和跨度标记不起作用

javascript - 如何使 2 个 Angular 列表在 html 表中彼此相邻显示

html - Extjs:修改链接(<a>) 'on click'

javascript - 数字解析在控制台中工作但在脚本中不起作用

java - 具有缓存实现的 war 文件在 grails 2.4.4 上工作正常但在 tomcat 7 上失败

c++ - 我怎么知道我的数组在缓存中?

python - 什么是__pycache__?

javascript - DOM 元素的 InnerHTML 属性已更改,但未渲染