jQuery Mobile:动态加载的内容使DOM膨胀



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

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

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

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

我注意到的是,如果我注入的内容包含从页面"弹出"的UI组件(例如对话框或带有data-native-menu = "false"的选择菜单),JQM会将覆盖元素直接插入到我的活动页面主内容分区之外的body标记或活动页面标记中。

例如:

<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中。如果我注入的新内容也需要覆盖元素,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"),然后检查一些属性。

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

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

最新更新