美文网首页
使用自定义属性思想,解决参数不正确问题

使用自定义属性思想,解决参数不正确问题

作者: 阿清哪去了 | 来源:发表于2018-03-11 21:31 被阅读28次

使用自定义属性思想,解决参数不正确问题

需求:点击哪个LI,就让其有SELECT样式类(对应的DIV也有这个样式类),其余的LI(DIV)都把SELECT样式类移除即可
根据上面,可以修改需求为,不管点击哪个LI,我们先让其所有的LI(DIV)都移除SELECT,再让当前点击的有SELECT样式

<div>
    <ul>
        <li class="select">新闻</li>
        <li>电影</li>
        <li>音乐</li>
    </ul>
    <div class="select">热烈庆祝中国召开十九大</div>
    <div>羞羞的铁拳</div>
    <div>不是诗</div>
</div>
//首先取到取到DOM对象
var tabBox=document.getElementById('tabBox');
var oList=tabBox.getElementsByTagName('li');
var oDivList=tabBox.getElementsByTagName('div');
//创建一个函数实现页卡切换功能
funciton change(index) {
    //设置形参,因为实现方法的时候,我们不清楚用户点击的是哪一个LI,当用户点击的时候,执行这个change方法,并且把这个LI的索引传递给我们,我们就可以在oList集合中通过索引获取到当前点击的这个LI对象
    //利用循环,先移除所有的LI(DIV)移除SELECT
    for(var i=0;i<oList.length;i++){
        oList[i].className='';
        oDivList[i].className='';
    }
    //让当前点击的这个LI有选中样式
    oList[index].className='select';
    oDivList[index].className='select';
}

//给每个LI绑定点击事件,点击的时候执行change方法,把当前点击的索引传递进来,实现页卡的切换
for(var i=0;i<oList.length;i++){
    oList[i].onclick=function(){
        change(i);//把参数传进去,执行方法
    }
}
//但是!浏览器报错!
//我们把change(i);改为console.log(i);看看,发现无论点击哪个,都只会打印3,说明i一直都为3,所以我们点击哪个都没用,因为传递的参数就存在问题

理性分析一下:
第一轮:
oList[0].onclick=function(){
console.log(i);
}
//给元素点击事件绑定方法,点击才会执行,此处绑定属于创建函数,空间中存储的都是字符串,i不是变量是字符
第二轮:
oList[1].onclick=function(){
console.log(i);
}
第三轮:
oList[2].onclick=function(){
console.log(i);
}
三次循环结束,因为进行了步长累加所以i=3;可是通过循环,我们只是给点击事件绑定了一个方法(存在内存中的字符串),并没有执行。

假设用户点击第二个LI:开始执行第二个绑定的方法(方法执行:形成一个新的作用域,把之前存储的字符串变为代码执行console.log(i);但是此时i已经变为3了,所以无论点击哪一个都为3的原因就在于此,从函数原理核心来看,就说得通了)

for(var i=0;i<oList.length;i++){
    oList[i].onclick=function(){
        /*change(?);(此处需要传递的参数是当前LI的索引,用i不行,用什么?)*/
        oList[i].myIndex = i;//使用自定义属性,给每个元素对象增加一个自定义属性用来存i
        onList[i].onclick = funciton(){
            //this指的是当前发生事情的对象,this.myIndex指点击这个LI的myIndex这个自定义属性的值
        change(this.myIndex);//传递进去的参数,i是正确的索引
        }
    }
}

再来分析一下:
i=0:oList[0].myIndex=0;
i=1:oList[1].myIndex=1;
i=2:oList[2].myIndex=2;
总结:
在使用参数的时候需要考虑参数的的正确存在方式。

相关文章

网友评论

      本文标题:使用自定义属性思想,解决参数不正确问题

      本文链接:https://www.haomeiwen.com/subject/akxgfftx.html