JavaScript之this

一.错误代码示例

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>this</title>
</head>
<body>
    <ul>
        <li>燃烧我的卡路里</li>
        <li>拿走拿走别客气</li>
        <li>拜拜甜甜圈</li>
    </ul>
</body>
</html>
<script type="text/javascript">
    //获取元素
    var li=document.getElementsByTagName('li');
    for(var i=0;i<li.length;i++){
        li[i].onclick=function(){
            // 这种方法之所以会错误,是因为for循环是在script标签中,
而不在函数中,这意味着:没有点击即函数没有执行的时候,
for循环已经执行完;而采用this(谁调用我我就代表谁),
即使for循环已经执行完,但是当我们点击第一个li,就代表了要获取第一个li元素
alert(li[i].innerHTML); } } </script>

二.this正确使用代码示例

  1.事件调用时

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>this</title>
</head>
<body>
    <ul>
        <li>燃烧我的卡路里</li>
        <li>拿走拿走别客气</li>
        <li>拜拜甜甜圈</li>
    </ul>
</body>
</html>
<script type="text/javascript">
    //获取元素
    var li=document.getElementsByTagName('li');
    for(var i=0;i<li.length;i++){
        li[i].onclick=function(){
            // 事件调用,this指的是时间前面的对象,例:本例中为li[i]
            alert(this.innerHTML);
        }
    }
</script>

点击第二个li元素效果:

2.直接调用时

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>this</title>
</head>
<body>
    <ul>
        <li>燃烧我的卡路里</li>
        <li>拿走拿走别客气</li>
        <li>拜拜甜甜圈</li>
    </ul>
</body>
</html>
<script type="text/javascript">
    //获取元素
    var li=document.getElementsByTagName('li');
        // 直接调用,这里点击生效是因为直接调用函数的特殊性:格式正确即可执行
        for(var j=0;j<li.length;j++){
        li[j].onclick=function(){
            onclickMe();
        }
        function onclickMe(){
            alert(this);
        }
    }
</script>

 attention:直接调用时this代表的永远是window,因为完整的代码其实是

window.onclickMe();
顺便一提alert完整代码前面也是省略了window,window是最高级别

三.this小例子
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>this的小例子</title>
    <style type="text/css">
    li{
        width: 50px;
        height: 50px;
        background:red;
        text-align: center;
        font: 30px/50px "simhei";
        float: left;
        margin-right: 5px;
        color: purple;
        border-radius: 50%;
        list-style: none;
        position: relative;
        left: 0;
        top: 0;
        transition: 0.5s;
    }
    ul{
        width: 285px;
        margin:10px auto;
    }
    .active{
        background:#fff;
        color: #000;
        border:1px solid red;
        position: relative;
        top: 100px;
    }
    </style>
    <script type="text/javascript">
    window.onload=function(){
       var li=document.getElementsByTagName('li');

       for(var i=0;i<li.length;i++){
        li[i].onclick=function(){
            // 这段代码之所以放着是因为,内层循环由于在函数中i会从0自加到最大值,故而前面点击后添加的样式会清除(所有下标都找到,都会被执行清除样式操作),如果把它放在事件操作之前则会失效
            for(var j=0;j<li.length;j++){
                li[j].className='';
            }
           this.className='active';
          };
       }
    };
</script>
</head>
<body>
    <ul>
        <li>1</li>
        <li>2</li>
        <li>3</li>
        <li>4</li>
        <li>5</li>
    </ul>
</body>
</html>

点击相应元素添加.active样式,其它清除样式


原文地址:https://www.cnblogs.com/zjm1999/p/10230261.html