仰望蓝天De蛙

导航

为dom添加点击事件,由此引发this指向的思考

下午没有任务,闲来无事仿个小网页巩固下基础知识。由于公司安全规定,原网页截图不便上传(也没法上传),回家后做了个简单的菜单以图示:

目标:点击某选项时,该选项底边加粗

1.首先定义click方法,然后在点击元素时调用该方法。('curr'类即红框内底边加粗效果)

var liElements = document.getElementsByClassName('headLi');
var addClick = function() {
    var currElement = document.getElementsByClassName('curr')[0];
    if (this !== currElement) {
        currElement.className = currElement.className.replace('curr', '');
        this.className = this.className + ' curr';
        console.log('this=' + this + 'currElement=' + currElement);
    }
}
for (var i = 0; i < liElements.length; i++) {
    liElements[i].onclick = function() {
        addClick();
    }
}

结果:加粗效果消失,第二次点击时控制台报错:

2.在绑定事件时直接写点击事件的方法

var liElements = document.getElementsByClassName('headLi');
for (var i = 0; i < liElements.length; i++) {
    liElements[i].onclick = function() {
        var currElement = document.getElementsByClassName('curr')[0];
        console.log('this=' + this + 'currElement=' + currElement);
        if (this !== currElement) {
            currElement.className = currElement.className.replace('curr', '');
            this.className = this.className + ' curr';
        }
    }
}

结果:功能正常

根据控制台可以看出,原因就在于this的指向:第一种方法中,this在“无所属对象的函数”中调用,指向了全局对象,第一次点击时,移除了元素的'curr'类,但没法为被点击的元素绑定'curr',于是当第二次点击时,控制台报undefined,无法找到绑定'curr'类的元素。

而第二种方法中,this所在的方法属于liElements[i]对象,于是指向了被点击的元素,一切正常。

关于this的用法可以参考博客:http://www.cnblogs.com/nimojs/p/javascript-this.html

posted on 2016-11-11 19:51  仰望蓝天De蛙  阅读(458)  评论(2编辑  收藏  举报