为何jQuery中无法多次追加同一DOM对象?
为什么jQuery中重复append同一元素只能添加一次?
嘿,这个问题问到点子上了!我来帮你把这里面的逻辑掰扯清楚:
首先先回顾你的代码场景,你最开始的写法是这样的:
$aObject = $('.className').clone(); $aObject.removeAttr('id'); $('#add-line').click(function() { $('#container').append( $aObject.clone()); });
你疑惑的是,如果把内层的clone()去掉,改成直接append $aObject:
$('#container').append( $aObject);
为什么按逻辑应该能多次添加,实际却只能加一次?能不能像数组添加相同元素那样,多次添加同一个对象?
核心原因:DOM元素是唯一的“实体”,而非普通JS对象
这里的关键区别在于:DOM元素不是普通的JavaScript值或引用对象,它是页面上的一个实际节点实体。
当你执行append($aObject)的时候,本质是把这个DOM节点插入到#container中。如果这个节点之前已经在DOM树的某个位置(包括第一次append后的#container里),第二次执行append时,浏览器会把它从当前位置移动到目标容器的末尾,而不是复制一个新的出来。这和数组完全不一样——数组里的元素可以是重复的引用或值,但DOM节点在整个DOM树里只能有一个父节点,只能存在一个位置。
能不能刻意多次添加“同一对象”?
这里要分两种情况看:
- 如果你想添加完全同一个DOM节点实体:抱歉,这做不到。DOM的规则就是一个节点只能属于一个父元素,不可能同时出现在页面的多个位置,也不可能在同一个容器里重复出现。
- 如果你想添加和$aObject结构、内容完全一致的元素:那必须用
clone(),就像你最开始的写法一样。clone()会创建一个原DOM节点的全新副本,这个副本和原对象的结构、属性、内容都一样,但却是独立的DOM实体——每次clone出来的都是新节点,所以可以多次append到容器里,实现你想要的“重复添加相同元素”的效果。
简单说:如果要的是“一模一样的新元素”,用clone;如果非要“同一个元素”,那DOM本身不允许这种操作。
内容的提问来源于stack exchange,提问作者user9623401
相关产品推荐
相关产品推荐

