如果我覆盖html,它是否从dom中删除?

时间:2013-04-16 18:41:35

标签: jquery dom

想象一下,我有以下代码:

...
<div id="div1">
    <div id="div2">Original div2</div>
</div>

<div id="div3"></div>

...

如果我跑

$('#div1').html('');
$('#div3').html('<div id="div2">New div2</div>');

我最终会遇到问题,因为我没有使用.remove()从dom中删除#div2,或者以这种方式清除html为我做这个吗?

如果div2包含一些附加了处理程序的javascript,比如

,该怎么办?
$('#div2').on('click',function() { ... });

是否也会删除,或者我需要关闭()它?

4 个答案:

答案 0 :(得分:3)

  

我最终会遇到问题,因为我没有使用.remove()从dom中删除#div2,或者以这种方式清除html为我做这个吗?

不,jQuery会在内部使用.remove(技术上它使用cleanData,但它会执行相同的清理。)

事件将会丢失,因此您必须重新绑定它们。

答案 1 :(得分:2)

您应该使用$('#div1').empty();而不是$('#div1').html('') 您可以使用克隆元素 $('#div3').html($('#div2').clone(true)); //这将继承附加到它的任何数据事件。

如果要将元素移动到另一个容器或其他位置,则可以使用append, prepend, before , after。您的所有数据和事件仍然完整无缺

见: -

<div id="container1">Container
    <div id="div2">div2</div>
</div>
<div id="container2">cotainer2</div>

$('#div2').click(function () {
    alert('test')
});
$('#container2').append($('#div2'));//Clicking on div2 will still alert.

答案 2 :(得分:2)

由于您的活动将丢失,您可以像这样使用.on(),因此您无需重新绑定活动

$(document).on('click','#div2',function() { ... });

答案 3 :(得分:2)

如上所述,您应该可以使用html()。在IE9中要小心&lt;虽然。来自jquery文档:

  

注意:在Internet Explorer(包括版本9)中,设置HTML元素的文本内容可能会损坏其子项的文本节点,这些节点因操作而从文档中删除。如果要保持对这些DOM元素的引用并且需要它们保持不变,请使用.empty()。html(string)而不是.html(string),以便在将新字符串分配给文档之前从文档中删除元素。元件。

如果要保留侦听器,则应使用委派事件侦听。请参阅on()的文档:

<div id="wrapper">
    <div id="div1">
        <div id="div2">Original div2</div>
    </div>

    <div id="div3"></div>
</div>

$('#wrapper').on('click', '#div2', function() {...});