在 Windows 窗体中,某些控件上有 BeginUpdate/EndUpdate 对。我想要类似的东西,但是对于 jQuery。
我有一个 div,里面有一个 div。像这样:
<div id='reportHolder' class='column'>
<div id='report'> </div>
</div>
在内部 div 中,我添加了一堆(7-12)对 a 和 div 元素,如下所示:
<h4><a>Heading1</a></h4>
<div> ...content here....</div>
内容的总大小可能是 200k。每个 div 仅包含一个 HTML 片段。其中,还有无数<span>
元素,包含其他 html 元素,并且它们嵌套,深度可能为 5-8 层。我认为没什么特别的。 (UPDATE: using 这个答案,我了解到该片段中有 139423 个元素。)
添加完所有内容后,
然后我创建了一个手风琴。像这样:
$('#report').accordion({collapsible:true, active:false});
这一切都很好。
问题是,当我尝试清除或删除报表 div 时,需要很长的时间,并且会出现 3 或 4 个弹出窗口,询问“您想停止运行此脚本吗?”
我尝试了几种方法:
选项1:
$('#report').accordion('destroy');
$('#report').remove();
$("#reportHolder").html("<div id='report'> </div>");
选项2:
$('#report').accordion('destroy');
$('#report').html('');
$("#reportHolder").html("<div id='report'> </div>");
选项3:
$('#report').accordion('destroy');
$("#reportHolder").html("<div id='report'> </div>");
在评论中得到建议后,我也尝试过:
选项 4:
$('#report').accordion('destroy');
$('#report').empty();
$("#reportHolder").html("<div id='report'> </div>");
不管怎样,它挂了很长一段时间。
对 Accordion('destroy') 的调用似乎不是延迟的根源。这是删除报表 div 中的 html 内容。
这是 jQuery 1.3.2。
EDIT- 修复了代码拼写错误。
ps:这种情况发生在 FF3.5 和 IE8 上。
问题:
什么事要花这么长时间?
如何更快地删除内容?
Addendum
我在“选项 4”期间闯入 FF 中的调试器,我看到的堆栈跟踪是:
data()
trigger()
triggerHandler()
add()
each()
each()
add()
empty()
each()
each()
(?)() // <<-- this is the call to empty()
ResetUi() // <<-- my code
onclick
我不明白为什么add()在堆栈中。我正在删除内容,而不是添加内容。恐怕在删除(全部)的上下文中,jQuery 做了一些幼稚的事情。就像它抓取 html 内容一样,文本是否会替换以删除一个 html 元素,然后调用 .add() 放回剩余的内容。
有没有办法告诉 jQuery 在从 dom 中删除 HTML 内容时不传播事件?
在 Windows 窗体中,某些控件上有 BeginUpdate/EndUpdate 对。我想要类似的东西,但是对于 jQuery。
related:
jquery:最快的 DOM 插入?