比如我创建了一个自定义对象var myobj={
item:null,
self:null,
init:function(obj){
this.item=obj;
this.self=this;
this.addEvent.apply(this.item,['mousedown',this.bind]);
}, addEvent:function(type,listener){
if(this.addEventListener)
{
this.addEventListener(type,listener,false);
}
else
{
this.attachEvent('on'+type,listener);
}
}, bind:function(){
},
}在myobj初始化后执行addEvent绑定事件,然后问题就出现了,到bind函数里面,如果使用this,这个this是myobj.item,我要想访问自身,该怎么办?
item:null,
self:null,
init:function(obj){
this.item=obj;
this.self=this;
this.addEvent.apply(this.item,['mousedown',this.bind]);
}, addEvent:function(type,listener){
if(this.addEventListener)
{
this.addEventListener(type,listener,false);
}
else
{
this.attachEvent('on'+type,listener);
}
}, bind:function(){
},
}在myobj初始化后执行addEvent绑定事件,然后问题就出现了,到bind函数里面,如果使用this,这个this是myobj.item,我要想访问自身,该怎么办?
里面就可以用othis了.
如果是给大家一起用的 就要提取来 成为一个公共APIinit:function(obj){
//。
//this.addEvent('mousedown',this.bind]); 这个不要了 没意义
var item=this.item;
var me=this;
if(item.addEventListener)
{
item.addEventListener('mousedown',function(){ me.bind(); },false);
}
else
{
item.attachEvent('onmousedown',function(){ me.bind(); } );
}
//对自己内部dom的绑定 就直接写 如果想套方法 就把 事件绑定 提取成公共的
//注意上面me的用法
},
item: null,
self: null,
init: function(obj) {
this.item = obj;
this.self = this;
this.addEvent.apply(this.item, ['mousedown',this.wrapper(this, this.bind)]);
},
wrapper: function(target, fn) {
return function() {
fn.apply(target);
}
},
addEvent: function(type, listener) {
if (this.addEventListener) {
this.addEventListener(type, listener, false);
} else {
this.attachEvent('on'+type,listener);
}
}, bind: function(){
}
}
为什么不把这句this.addEvent.apply(this.item,['mousedown',this.bind]);
直接换成 this.item.onmousedown = this.bind; addEvent 方法应该可以去掉..还分浏览器那要考虑..不明白为什么 求解!!~
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
<script type="text/javascript">
function addEventListener(target, eventName, fn) {
if (target.addEventListener) {
target.addEventListener(eventName, fn, false);
} else {
target.attachEvent('on' + eventName, fn);
}
}
window.onload = function() {
var testObj = {
name: "123",
init: function() {
var test = document.getElementById("test");
addEventListener(test, "click", this.dispatch.bind(this));
},
dispatch: function() {
alert(this.name);
}
};
testObj.init();
}
</script>
</head>
<body>
<div id="test" style="width:400px; height:300px; border-style:solid; border-width:1px; background-color:#ffffff"></div>
</body>
</html> Browser Support
○ Firefox 4
○ Internet Explorer 9
○ Chrome 7+
比如我这样:<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
<script type="text/javascript">
var myobj = {
item: null,
self: null,
pro:1,
init: function(obj) {
this.item = obj;
this.self = this;
this.addEvent.apply(this.item, ['mousedown',this.wrapper(this, this.bind)]);
this.addEvent.apply(this.item, ['mouseup',this.wrapper(this, this.unbind)]);
},
wrapper: function(target, fn) {
return function() {
fn.apply(target);
}
},
addEvent: function(type, listener) {
if (this.addEventListener) {
this.addEventListener(type, listener, false);
} else {
this.attachEvent('on'+type,listener);
}
},
removeEvent:function(type,listener)
{
if(this.removeEventListener)
{
this.removeEventListener(type,listener,false);
}
else
{
this.detachEvent('on'+type,listener);
}
},
bind: function(){
this.addEvent.apply(this.item, ['mousemove',this.wrapper(this, this.getEventPoint)]);
},
unbind: function(){
this.removeEvent.apply(this.item, ['mousemove',this.wrapper(this, this.getEventPoint)]);
},
getEventPoint:function(event){
var evt=event||window.event;
document.getElementById('test').innerHTML=evt.clientX+":"+evt.clientY;
}
}
window.onload=function(){
var obj=document.getElementById('test');
myobj.init(obj);
}</script>
</head>
<body>
<div id="test" style="width:400px; height:300px; border-style:solid; border-width:1px; background-color:#ffffff"></div>
</body>
</html>本意是想在框内按下鼠标时能监测鼠标位置,不按的时候解除绑定,不再监测,可是实际情况是会一直绑定着,不知道该如何解除。
PS:因为在getEventPoint方法里还想用到对象本身,所以需要使用wrapper方法包装this。如果不用包装的话,能正常解除绑定的。
另外,wrapper这个方法在chrome和IE8下使用没出问题,但firefox5似乎在 fn.apply(target);这一句停下来
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
<script type="text/javascript">
var myobj = {
item: null,
self: null,
pro:1,
init: function(obj) {
this.item = obj;
this.self = this;
this.handler = this.wrapper(this, this.getEventPoint);
this.addEvent.apply(this.item, ['mousedown', this.wrapper(this, this.bindMouse)]);
this.addEvent.apply(this.item, ['mouseup', this.wrapper(this, this.unbindMouse)]);
},
bindMouse: function() {
this.addEvent.apply(this.item, ["mousemove", this.handler]);
},
unbindMouse: function() {
this.removeEvent.apply(this.item, ["mousemove", this.handler]);
},
wrapper: function(target, fn) {
return function() {
fn.apply(target, arguments);
}
},
addEvent: function(type, listener) {
if (this.addEventListener) {
this.addEventListener(type, listener, false);
} else {
this.attachEvent('on' + type, listener);
}
},
removeEvent: function(type, listener) {
if(this.removeEventListener) {
this.removeEventListener(type, listener, false);
}
else {
this.detachEvent('on' + type, listener);
}
},
getEventPoint:function(event) {
var evt = event || window.event;
this.item.innerHTML = evt.clientX + ":" + evt.clientY;
}
}
window.onload = function() {
var obj = document.getElementById('test');
myobj.init(obj);
}</script>
</head>
<body>
<div id="test" style="width:400px; height:300px; border-style:solid; border-width:1px; background-color:#ffffff"></div>
</body>
</html>1.为什么this.addEvent这种自带的方法也要apply
2.为什么this.addEvent会用this来引用
3.你代码习惯非常的不好啊
4.wrapper方法现在几乎可以用bind代替了