gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 13:24:10 24 4
gpt4 key购买 nike

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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com