| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1687 人关注过本帖
标题:请大家帮忙看看:如何在事件处理函数中重定向"this"?
只看楼主 加入收藏
netwind007
Rank: 1
等 级:新手上路
帖 子:9
专家分:0
注 册:2010-12-14
收藏
 问题点数:0 回复次数:28 
请大家帮忙看看:如何在事件处理函数中重定向"this"?
我定义了一个对象,它会自动生成两个DIV,并把它们插入到<body></body>中,但我希望这两个DIV在对象中是private的。我想给其中一个DIV添加一个CLICK事件,当它被CLICK时,会改变另一个DIV的背景色。由于这两个DIV在对象中是private的,所以我专门写了一个函数来做这件事。整个代码如下:
程序代码:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www. xmlns="http://www. xml:lang="en" lang="en">
    <head>
        <title>Test Page</title>
        <script type="text/javascript">
            function MyClass(){
                this._oDiv1 = document.createElement("div");
                this._oDiv1.style.cssText = "width:200px; height:150px; background-color:#0c0";
                document.body.appendChild(this._oDiv1);
               
                this._oDiv2 = document.createElement("div");
                this._oDiv2.style.cssText = "width:150px; height:30px; background-color:#f55; color:black; margin-top:10px; text-align: center";
                this._oDiv2.innerHTML = "Change to blue";
                document.body.appendChild(this._oDiv2);
            }
            MyClass.prototype.addClick = function(){
                this._oDiv2.onclick = function(){
                    this._oDiv1.style.backgroundColor = "#00c";    //problem happens here
                    return false;
                };
                //alert(this._oDiv2.onclick.toString());
            };
           
            function start(){
                var o = new MyClass();
                o.addClick();
            }
        </script>
    </head>
    <body onload="start();">
    </body>
</html>
其中MyClass.prototype.addClick便是用来给this._oDiv2添加click事件的,但是这段代码不起作用,原因出在this._oDiv1.style.backgroundColor = "#00c";这一句:这里的this本应指向对象的当前实例,但在这里却指向了产生CLICK事件的那个元素(即_oDiv2),结果导致错误。我不知道该如何让这里的this正确的指向当前对象实例?请大家指点一下。先谢谢了。
搜索更多相关主题的帖子: 函数 
2010-12-14 04:41
netwind007
Rank: 1
等 级:新手上路
帖 子:9
专家分:0
注 册:2010-12-14
收藏
得分:0 
刚才去国外的网站搜索了一下(英文不太好,换了好几回搜索词),找到了一个解决办法,供大家参考。

解决办法就是用闭包:
MyClass.prototype.addClick = function(){
    var that = this;
    this._oDiv2.onclick = function(){
         that._oDiv1.style.backgroundColor = "#00c";
         return false;
    };
};

谢谢大家。
2010-12-14 05:52
hugeannex
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:6
帖 子:483
专家分:911
注 册:2005-3-20
收藏
得分:0 
那也不是private的呀!

世事如潮我如水,只叹江湖几人回。
2010-12-14 09:17
foktime
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:奥斯维辛
等 级:贵宾
威 望:35
帖 子:795
专家分:2742
注 册:2009-9-4
收藏
得分:0 
顺便出个小题目
程序代码:
name = 'window';
var Fun = function() {
this.name = 'Fun';

this.show = function() {
return function() {
alert(this.name);
}
}
};

var Test = function() {
this.name = 'Test';
this.msg = new Fun().show();
};

new Test().msg();
猜弹出啥 为什么
2010-12-14 09:46
netwind007
Rank: 1
等 级:新手上路
帖 子:9
专家分:0
注 册:2010-12-14
收藏
得分:0 
回复 3楼 hugeannex
你是指_oDiv1和_oDiv2吗?

其实本质上,javascript的object没有private成员,我们只是在逻辑上把它们当成private来看,这就是为什么我要定义一个function来绑定事件处理,而不是让用户直接用
o._oDiv1.onclick = "...";
来绑定事件处理——因为这样就暴露了_oDiv1。

谢谢。
2010-12-14 14:37
netwind007
Rank: 1
等 级:新手上路
帖 子:9
专家分:0
注 册:2010-12-14
收藏
得分:0 
以下是引用foktime在2010-12-14 09:46:03的发言:

顺便出个小题目
var name = 'window';
var Fun = function() {
this.name = 'Fun';
 
this.show = function() {
return function() {
alert(this.name);
}
}
};
 
var Test = function() {
this.name = 'Test';
this.msg = new Fun().show();
};
 
new Test().msg();猜弹出啥 为什么
版主这道题出得好呀!我自己试了一下,虽然和一开始想的结果不一样(呵呵,这是婉转的说法,其实就是答错了),但我的思路是正确的。

我一开始想的是“window”,因为我知道return function(){alert(this.name);}是把alert(...)返回到上一级执行,所以其作用域是上一级,但我一开始忽视了Test这一级(马虎了),不知怎的就把上一级想成了global,所以想结果是“window”。

其实,这道题的本质就是:
var Test = function(){
    this.name = 'Test';
    this.msg = function(){alert(this.name);}
}
结果当然是“Test”。

Javascript的this指代有时候是有点绕人,而且经常惹祸,不像C#里的this一向规规矩矩老实巴交,以后得多留意。

呵呵,不知我的回答版主是否满意,还请多多指教。
2010-12-14 15:20
foktime
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:奥斯维辛
等 级:贵宾
威 望:35
帖 子:795
专家分:2742
注 册:2009-9-4
收藏
得分:0 
-2333

[ 本帖最后由 foktime 于 2013-11-12 16:19 编辑 ]
2010-12-14 15:31
netwind007
Rank: 1
等 级:新手上路
帖 子:9
专家分:0
注 册:2010-12-14
收藏
得分:0 
回复 4楼 foktime
刚才想去投版主一票,顺便挣50分,结果因为是新人,被剥夺了民主权力。唉,啥时论坛里能实现普选呀?
2010-12-14 15:40
foktime
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:奥斯维辛
等 级:贵宾
威 望:35
帖 子:795
专家分:2742
注 册:2009-9-4
收藏
得分:0 
回复 6楼 netwind007
回答基本正确 这是绕个小弯而已 呵呵
js的this很灵活,具体指向谁一定要结合上下文
设计代码的时候在使用this时也要很清楚自己要做什么,一不小心就指飞老
2010-12-14 15:42
foktime
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:奥斯维辛
等 级:贵宾
威 望:35
帖 子:795
专家分:2742
注 册:2009-9-4
收藏
得分:0 
以下是引用netwind007在2010-12-14 15:40:27的发言:

刚才想去投版主一票,顺便挣50分,结果因为是新人,被剥夺了民主权力。唉,啥时论坛里能实现普选呀?
那你就声援一下吧  咱们版选版主不存在竞争,有人选就会中,因为人不多 呵呵

有没有选举权要看在版里的活跃度,其实多发几个帖子你就有选举权了,只是为了防止马甲作弊
2010-12-14 15:47
快速回复:请大家帮忙看看:如何在事件处理函数中重定向"this"?
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.026518 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved