【问题标题】:Hide vs Remove DOM elements [closed]隐藏与删除 DOM 元素 [关闭]
【发布时间】:2012-12-13 00:57:54
【问题描述】:

隐藏与删除

处理 DOM 元素、隐藏或删除的最佳方法是什么?假设环境可以多次改变。元素可以有点击回调或其他事件回调。

隐藏

什么时候隐藏什么是最好的?如果点击一个按钮隐藏多个项目,你可以一个一个地隐藏,也可以创建css规则来做到这一点。

选项 1:

<style>
.superContent{/*...*/}

.superContent.noEdit .occultable{
    display:none;
}
</style>

<form class=”superContent” action=”...”>
    <label>Name</label>
    <input type=”text” />
    <input type=”submit” class=”occultable” value=”send”/>
</form>

<button id=”hideAll”>Edit</button>
<script type=”text/javascript”>
    $(“#hideAll”).click(function(){
        $(“.superContent”).toggleClass(“noEdit”);
    });
</script>

http://jsfiddle.net/p8mU8/

另一种选择是只隐藏所需的项目(这些可能很少或很多):

选项 2:

<script type=”text/javascript”>
    $(“#hideAll”).click(function(){
        $(“.occultable”).toggle();
    });
</script>

http://jsfiddle.net/JAmF9/


删除

要修改 DOM,您还可以删除不需要的项目并稍后重新插入。

选项 3:

<form class="superContent">
    <label>Name</label>
    <input type="text" />
    <input id="sendbutton" type="submit" class="occultable" value="send"/>
</form>

<button id="hideAll">Edit</button>​

<script type=”text/javascript”>
$("#hideAll").click(function(){
    if( $(".superContent").find("#sendbutton").length>0 ){
        $(".superContent").find("#sendbutton").remove();
    }
    else{
        $(".superContent").append('<input id="sendbutton" type="submit" class="occultable" value="send"/>');
    }
});​
</script>

http://jsfiddle.net/Yj5Aw/

这些只是小例子。假设 UI 包含大量元素。你认为最好的选择是什么?哪个内存泄漏更少,性能更高?

有一些 javascript 框架,例如 kendo-ui,可以删除元素。 jQueryUI 更喜欢隐藏项目,但小部件 Tab sortable 会创建用户临时拖动的选项卡。

【问题讨论】:

  • 如果以后不想显示该元素,请使用remove,否则使用addClassremoveClass 隐藏/显示该元素。
  • 我喜欢隐藏元素,如果我打算在未来再次展示它们。在我看来,它不会像重新创建 UI 那样容易给 UI 带来意想不到的结果。

标签: javascript jquery css optimization


【解决方案1】:

很明显你知道

  • 当您想重新显示元素时,隐藏是最好的选择。
  • 当您不需要再次使用这些元素时,最好删除。

当您隐藏元素然后重新显示它们时,这些元素不会丢失所有的回调和数据,特别是在使用 jQuery 时。

当您删除不必要的元素时,您会减少为您的页面分配的内存,但在大多数情况下这不会是一个显着的变化。

【讨论】:

  • 创建一个 css 规则来显示/隐藏元素应该比通过 javascript 操作属性更快。我认为在 quirksmode.org 上有一个测试显示了这一点
  • 这并不能真正回答问题。假设我可以显示 3 个不同的数据表,每个表都有 数千 行。我使用一些标签导航在表格之间切换。问题是,DOM 是否有数千个节点是否重要,即使表有display:none 用于非活动选项卡?它会产生某种形式的缓慢吗?应该回答。即使您删除了元素,事件也不会被删除,如果有人知道 任何基本的 jQuery,就会使用 detach 而不是 remove
  • 这如何适用于我的应用程序各个部分的悬停工具提示弹出窗口?我应该始终添加/删除嵌套在当前悬停元素下的工具提示,还是将单个 tooltip 元素添加到页面并在需要的位置定位/显示 @gdoron
  • 现在(问这个问题 6 年后)前端的主要框架(Angular、React、Vue)使用删除/创建策略,虽然现在我们谈论的是销毁组件,而不仅仅是 DOM .
  • 我为此创建了一个简单的基准来比较两种情况的性能:measurethat.net/Benchmarks/Show/14104/0/…
猜你喜欢
  • 1970-01-01
  • 2022-01-09
  • 2017-12-21
  • 2021-10-30
  • 2018-03-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-18
相关资源
最近更新 更多