<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN"
"http://www.w3.org/TR/html4/strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>11</title>
<script>
window.onload = function(){
var list = document.getElementsByTagName("li");
for(var i = 0; i < list.length; i++){
list[i].onclick = function(){
alert(list[i].innerHTML);//为什么改成this就好了?? }
}
};
</script>
</head>
<body>
<ul>
<li>1</li>
<li>2</li>
<li>3</li>
</ul>
</body>
</html>

解决方案 »

  1.   

    改为this以后
    list[i].onclick = function(){
    alert(list[i].innerHTML);//为什么改成this就好了?? }
    }
    this指的就是当前被点击的那个list
      

  2.   

    事件绑定的时候是只绑定指针的,
    并不会把 
    onclick=functioin(){
    alert(list[i].innerHTML)
    }这里的i替换成你绑定事件时的0,1,2的,而是实际执行onclick的时候才去读i的值,
    而i的值早变了(你这里因为i是局部变量,onclik的时候i就是undefined)。
      

  3.   

    这个我知道啊  但是用list[i].innerHTML 为什么就会报错误 说list[i]不存在????
      

  4.   

    javascript中,在某个对象上调用方法
    这个方法的this指向的是对象本身
      

  5.   

    因为你的程序运行完以后i = 3;你的list集合只有3个,索引只到2 list[3]肯定不存在,这样明白吧而改用this后就不会出现这个问题
      

  6.   

    你实际调用时List[i]就不知道是哪一个对象了.
    而this将本对象已经绑定到事件中了.
      

  7.   

    我2楼写的(你这里因为i是局部变量,onclik的时候i就是undefined)。
    经试验, i 确实是 3我本以为i是写在function里是局部变量,看来我理解错了。
    看来
    function foo(){
    var i; //局部变量
    }
    事件绑定范围内的
    a.onclick=function(){var i;//全局变量
    }变量定义方式不一样。
    如有被这一句误解的同学,抱歉。
      

  8.   


    这样写貌似也是有些问题的个人感觉是:i应该并不是全局变量,这快已经涉及到了闭包的问题。
    i会一直存在于window.onload这个函数中
    不知道是不是这样 ,请高手指正
      

  9.   


    应该你是正确的,
    点 li 时alert(i) ,结果是3,点button 的结果显示是5
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN"
    "http://www.w3.org/TR/html4/strict.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml" lang="en">
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>11</title>
    <script type="text/javascript" >
        var i = 5;
        window.onload = function() {
            var list = document.getElementsByTagName("li");
            for (var i = 0; i < list.length; i++) {
                list[i].onclick = function() {
                    alert(i);
                  //  alert(list[i].innerHTML); //为什么改成this就好了?? }
                }
            };
        }
    </script>
    </head>
    <body>
    <ul>
    <li>1</li>
    <li>2</li>
    <li>3</li>
    </ul>
    <input type="button" value="geti" onclick="alert(i)"  />
    </body>
    </html>
      

  10.   

    list[i].onclick = function(){
    alert(i);//加上这一句你马上就明白为什么错了
    alert(list[i].innerHTML);//为什么改成this就好了??
    }js里面for语句没有自己的作用域,你这儿的i值在事件发生时已经被改变,alert一下就明白了
    这儿你用的给onclick方法赋值的方式添加事件,方法里面的this指代对象自身,所以不会有问题
      

  11.   


    window.onload = function(){
    var list = document.getElementsByTagName("li");
    for(var i = 0; i < list.length; i++){
    list[i].onclick = function(){
    alert(i);
    }
    }
    }如果这样的话是在同一个作用域,i访问的都是同一个活动变量,所以为3.
    为什么this.onclick的话能弹出对应的值呢?
    很简单应为 对象.onclick = function(){alert(this)}这里的this就是对象。
    http://blog.csdn.net/a569171010 这里面几篇文章可以看一下,很有用的
      

  12.   


    window.onload = function(){
    var list = document.getElementsByTagName("li");
    for(var i = 0; i < list.length; i++){
    list[i].onclick = function(){
    alert(i);
    }
    }
    }如果这样的话是在同一个作用域,i访问的都是同一个活动变量,所以为3.
    为什么this.onclick的话能弹出对应的值呢?
    很简单应为 对象.onclick = function(){alert(this)}这里的this就是对象。
    http://blog.csdn.net/a569171010 这里面几篇文章可以看一下,很有用的
      

  13.   

    就是闭包得问题, 而函数闭包保存的这个i的值  是函数被激活的时候所存储的值 建议你们去看 http://blog.csdn.net/shyleoking/article/details/7307763