首页 新闻 会员 周边

为什么在onclick下获取不了i?是闭包问题吗?

0
悬赏园豆:20 [已解决问题] 解决于 2011-10-16 17:00

我想让单击以后让第五个以后的li全部显示.
但这涉及到闭包问题吗?
我对闭包不了解.
谁帮忙写一下并加上注释,谢谢了.

另外谁发一下闭包的相关知识

<!DOCTYPE HTML>
<html>
<head>
<title> New Document </title>

<style type="text/css">
*
{ margin:0; padding:0;}
body
{font-size:12px;text-align:center;}
a
{ color:#04D; text-decoration:none;}
a:hover
{ color:#F50; text-decoration:underline;}
.SubCategoryBox
{width:600px; margin:0 auto; text-align:center;margin-top:40px;}
.SubCategoryBox ul
{ list-style:none;}
.SubCategoryBox ul li
{ display:block; float:left; width:200px; line-height:20px;}
.showmore
{ clear:both; text-align:center;padding-top:10px;}
.showmore a
{ display:block; width:120px; margin:0 auto; line-height:24px; border:1px solid #AAA;}
.showmore a span
{ padding-left:15px; background:url(images/down.gif) no-repeat 0 0;}
.promoted a
{ color:#F50;}
</style>

</head>

<body>

<div class="SubCategoryBox">
<ul id="list">
<li ><a href="#">佳能</a><i>(30440) </i></li>
<li ><a href="#">索尼</a><i>(27220) </i></li>
<li ><a href="#">三星</a><i>(20808) </i></li>
<li ><a href="#">尼康</a><i>(17821) </i></li>
<li ><a href="#">松下</a><i>(12289) </i></li>
<li ><a href="#">卡西欧</a><i>(8242) </i></li>
<li ><a href="#">富士</a><i>(14894) </i></li>
<li ><a href="#">柯达</a><i>(9520) </i></li>
<li ><a href="#">宾得</a><i>(2195) </i></li>
<li ><a href="#">理光</a><i>(4114) </i></li>
<li ><a href="#">奥林巴斯</a><i>(12205) </i></li>
<li ><a href="#">明基</a><i>(1466) </i></li>
<li ><a href="#">爱国者</a><i>(3091) </i></li>
<li ><a href="#">其它品牌相机</a><i>(7275) </i></li>
</ul>
<div class="showmore" id="showmore">
<a href="more.html"><span>显示全部品牌</span></a>
</div>
</div>
<script type="text/javascript">

var $ =function(id){return document.getElementById(id)};
var ul = $("list");
var li = ul.getElementsByTagName("li");
var link = $("showmore").getElementsByTagName("a")[0];
for(var i=0; i<li.length; i++){
if(i >5){
li[i].style.display
="none";
}
if(i == li.length-1){
li[i].style.display
="block";
}
link.onclick
=function(){
if(i>5){
li[i].style.display
="block";
}

returnfalse;
}
}
</script>




</body>
</html>
深蓝色梦想的主页 深蓝色梦想 | 初学一级 | 园豆:6
提问于:2011-10-15 02:24
< >
分享
最佳答案
0

这个不需要用闭包,就可以实现的啊,你现在的写法应该是会报错的,在页面加载的时候,就会执行你的javascript代码,在你的for循环里面,定义了局部变量i,并给link绑定了onlick事件(其实这个放到for循环外面就好了,只需要绑定一次就行),,所以在页面加载完以后,局部变量i会被销毁,再点击"显示全部品牌",i就找不到了。所以我的做法是在点击事件中加一个循环。

link.onclick =function(){                                
  for (var j=0;j<li.length;j++){
    if(j>5){
      li[j].style.display ="block";
    }
  }
  return false;
}

你要的效果就实现了,希望对你有帮助。

闭包的知识给你一个连接:http://www.cn-cuckoo.com/2007/08/01/understand-javascript-closures-72.html

收获园豆:20
水晶途途 | 小虾三级 |园豆:1443 | 2011-10-15 08:01

所以在页面加载完以后,局部变量i会被销毁   //这个销毁是怎么理解啊?

深蓝色梦想 | 园豆:6 (初学一级) | 2011-10-15 12:38

@深蓝色梦想: 

就是i的内存被回收了,i是局部变量,而你在前面定义的$,ul,li,link,这些是全局的变量,是定义在window对象里面的,所以存在。

水晶途途 | 园豆:1443 (小虾三级) | 2011-10-15 12:43

@轻风拂夏: 回收了???还是不懂

深蓝色梦想 | 园豆:6 (初学一级) | 2011-10-15 13:39
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册