昨天在写 jQuery 的时候碰到个小问题纠结了我蛮久,后来在 foxling 的指点下才知道是那么一回事。
问题是这样滴,有一个 UL 列表,在某个事件响应之后要把 UL 列表里面的 LI 内容给逐行移除掉,于是有了下面的 HTML 代码:
代码如下 | 复制代码 |
<ul id="test"> <li>1</li> <li>2</li> <li>3</li> <li>4</li> <li>5</li> </ul> <a href="#" id="del">删除</a> |
以及下面的 JavaScript 代码:
代码如下 | 复制代码 |
$('#del').click(function(){ var list = $('#test'); var len = list.find('li').length; for(var i = 0; i < len; i++){ list.find('li:eq('+ i +')').remove(); } }); |
我刚写完的时候觉得逻辑很合理,应该没什么问题,先计算出 UL 标签里面有多少个 LI ,然后利用 For 循环逐个把里面每个 LI 的内容移除掉,但是代码一执行的时候,问题就出来了,它并没有把里面的内容全部移除掉,而是还有一些 LI 遗留在页面上。
代码如下 | 复制代码 |
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script> <script> $(function(){ $('#del').click(function(){ var list = $('#test'); var len = list.find('li').length; for(var i = 0; i < len; i++){ list.find('li:eq('+ i +')').remove(); } }); }); </script> </head> <body> <ul id="test"> <li>1</li> <li>2</li> <li>3</li> <li>4</li> <li>5</li> <li>6</li> <li>7</li> <li>8</li> <li>9</li> <li>10</li> </ul> <a href="#" id="del">删除</a> </body> </html>。 |
后来在 foxling 的指点下,才得知这其中的原因,就是当 i 等于 0 的时候,这时是正确的删除了第一个 LI 标签(其索引为 0);当 i 等于 1 的时候,原来列表中的第 2 个 LI 标签的索引由于前一个 LI 标签被删除的原因从 1 变成了 0,所以该 LI 标签并没有被移除,而此时被移除的是原来列表中的第 3 个 LI 标签,此时它的索引已变为 1 了,如此循环……这就是为什么执行完该 for 循环之后还有一些内容没有被移除的原因了。
上面的 JavaScript 只要修改一点点的地方就 OK 了:
代码如下 | 复制代码 |
$('#del').click(function(){ var list = $('#test'); var len = list.find('li').length; for(var i = 0; i < len; i++){ list.find('li:eq(0)').remove();//因为每次循环删除一个 LI 标签后,跟在其后的 LI 标签的索引都变为了 0 } }); |
例
代码如下 | 复制代码 |
<DIV id="Previewpics"> <LI id="fileid16"><IMG src="https://img.lookmw.cn/201005/127311533698.gif.thumb_100_75.jpg"><BR> <INPUT onclick="window.open(this.src)" type="button" src="uploads/201005/127311533698.gif" value="大图"> <INPUT onclick="deleteimg(this.src)" type="button" src="16" value="删除"> </LI> <LI id="fileid17"><IMG src="https://img.lookmw.cn/201005/127311534291.jpg.thumb_100_75.jpg"><BR> <INPUT onclick="window.open(this.src)" type="button" src="uploads/201005/127311534291.jpg" value="大图"> <INPUT onclick="deleteimg(this.src)" type="button" src="17" value="删除"> </LI> <LI id="fileid18"><IMG src="https://img.lookmw.cn/201005/127311536399.gif.thumb_100_75.jpg"><BR> <INPUT onclick="window.open(this.src)" type="button" src="uploads/201005/127311536399.gif" value="大图"> <INPUT onclick="deleteimg(this.src)" type="button" src="18" value="删除"> </LI> </DIV> 再看执行js后效果: <DIV id="Previewpics"> |
对比一下就知道啦.li的id为fileid18的被删除了.
主要代码如下:
代码如下 | 复制代码 |
$('li').remove('#fileid'+fid); |
例2
代码如下 | 复制代码 |
<html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> <title></title> <script src="js/jquery.js" type="text/javascript"></script> function addSpot(obj, sm) { if($('div.spot').size() >= sm) {$(obj).hide();} <body> |