删除节点方法要注意的区别
JQ提供的三个方法
如果文档中某一个元素多余,那么应该将其删除。jQuery提供了三种删除节点的方法。remove(),detach(),empty(),接下来,我们就进行一一介绍。
1.remove()方法
作用是从DOM中删除所有匹配的元素,传入的参数用于根据jQuery表达式来筛选元素。测试HTML代码如下:
1 <ul> 2 <li title="one">First li element</li> 3 <li title="two"> 4 Second li element 5 <ol> 6 <li>li element of ol</li> 7 </ol> 8 </li> 9 <li> 10 Third li element 11 <dl> 12 <dt>dt element of dl</dt> 13 <dd>dd element of dd</dd> 14 </dl> 15 </li> 16 </ul>
事先给ul的第二个li添加点击事件:
$('ul > li:eq(1)').click(function() { alert('onclick') });
然后首先使用remove()方法进行测试,测试代码如下:
1 //remove()方法 2 // 首先声明一个变量,来存储被删除元素的引用 3 var removeObj = null; 4 // 删除第二个li,并返回被删除元素的引用 5 $('button:eq(0)').click(function() { 6 removeObj = $('ul > li:eq(1)').remove(); 7 }); 8 // 被删除元素重新添加到ul中 9 $('button:eq(1)').click(function() { 10 $('ul').append(removeObj); 11 }); 12 // 删除li元素title属性为"three"的 13 $('button:eq(2)').click(function() { 14 $('ul > li').remove('li[title="three"]'); 15 });
依次点击第一,二,三个按钮,依次执行上面程序后,结果如图:
当某个节点使用remove()方法后,该节点以及所包含的所有后代节点将同时被删除。(图1)。这个方法的返回值是一个指向已被删除的节点的引用,因此可以在以后再使用这些元素。(图2)。最后还可以通过传递参数来选择性地删除元素。(图3)。特别要指出的一点是: 当使用被删除节点的引用重新添加元素到文档中时,处了这个元素本身得以保留外,其他的比如绑定的事件,附加的数据等都会被移除。所有添加回文档中后,点击次元素,并不会弹出"onclick",即绑定的事件没有保留。
2. detach()方法
detach()和remove()一样,也是从DOM中去掉所有匹配的元素。但是需要注意的是这个方法也不会把匹配的元素从JQuery对象中删除,因而可以在将来再使用这些匹配的元素。与remove()唯一不同的是所有绑定的事件,附加的数据等都会保留下来。
1 // detach() 方法 2 var detachObj = null; 3 // 删除第二个li元素 4 $('button:eq(3)').click(function() { 5 detachObj = $('ul > li:eq(1)').detach(); 6 }); 7 // 重新添加到文档中 8 $('button:eq(4)').click(function() { 9 // 注意: 添加成功后,点击次元素会弹出"onclick",确实保留了绑定事件 10 $('ul').append(detachObj); 11 });
3. empty()方法
严格来说, empty()方法并不是删除节点,而是清空节点,它能清空元素中的所有后代节点。jQuery代码如下:
1 $('button:eq(5)').click(function() { 2 //注: empty()方法不接受参数 3 $('ul > li:eq(1)').empty(); 4 });
点击按钮后,如图
我们发现第二个li元素的内容被清空了,只剩下空的li标签。因此特别注意是元素里面的内容哦。
HTML DOM remove(),removeChild()
印象中在DOM中除了removeChild()方法,貌似好像也有remove(), removeNode()方法,故查找下了资料。先说说removeChild()方法吧。
removeChild()
定义: 删除指定元素的某个指定的子节点。语法: node.removeChild(node); 参数node为被删除的节点,以Node对象返回被删除的节点,如果节点不存在则返回null。
removeChild()会删除选中元素本身以及所有的后代元素。就不贴代码了,感兴趣的朋友可以亲测。
remove()
查了w3cSchool,里面确实有remove()方法,不过使用这个方法有很大的局限性。
定义: 用于从下列列表删除选项。 语法: selectObject.remove(index); 参数index是必需的,为要删除的选项的索引号。
测试了下,如果参数不是规定的索引号,那么默认是删除索引号为0的选项(即第一个选项)。 感兴趣的移步w3cschool
removeNode()
在核心JS中没有这个方法,但是在IE中有这样的方法,但是在FF等浏览器中并不认识。这样好像用处就并不大了。想了解的看这篇博文吧!