锁定老帖子 主题:关于Event.observe的问题
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2007-06-07
<html> <head> <script src="prototype.js" type="text/javascript"></script> <script language="javascript" type="text/javascript"> Event.observe(window,'load', function(){Event.observe('set1','change', function(){ //在ff下 if(this.vlaue) $('tx1').hide(); else $('tx1').show(); //在ie下this没有指象select if(event.srcElement.value) $('tx1').hide(); else $('tx1').show(); }) }) </script> <title></title> </head> <body> <input id='tx1' name='tx1'/> <select id='set1' > <option >choose</option> <option value='1' >1</option> <option >2</option> <option >3</option> </select> </body> </html> 在ff下this指向select元素,在ie下我用for in 只打出了_extend不知道为什么?prototype不是跨浏览器吗 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2007-06-07
FF下是使用addEventListener,会把this传进去,而IE是attachEvent是不会把this传进去的,或者说this指向的仍然是window对象
|
|
返回顶楼 | |
发表时间:2007-06-07
非常感谢,那怎样写可以通用呢
|
|
返回顶楼 | |
发表时间:2007-06-07
_observeAndCache: function(element, name, observer, useCapture) { if (!this.observers) this.observers = []; if (element.addEventListener) { this.observers.push([element, name, observer, useCapture]); element.addEventListener(name, observer, useCapture); } else if (element.attachEvent) { this.observers.push([element, name, observer, useCapture]); element.attachEvent('on' + name, observer); } }, 我看了prototype.js的源码,是说ie的attachEvent的方法不能把this指针传进去吗 |
|
返回顶楼 | |
发表时间:2007-06-07
此乃MS被人咒骂的问题之一。prototype只是稍稍包装,并没有解决所有的问题。也许以后的版本会。或者你可以用其他解决这个问题的库。
|
|
返回顶楼 | |
发表时间:2007-06-07
用bind
<html> <head> <script src="http://www.iteye.com//javascripts/prototype.js?1157705297" type="text/javascript"></script> <script language="javascript" type="text/javascript"> Event.observe(window,'load', function(){Event.observe('set1','change', (function(){ $('tx1').value=this.value;}).bind($('set1')) ) }) </script> <title></title> </head> <body> <input id='tx1' name='tx1'/> <select id='set1' > <option value='0'>choose</option> <option value='1' >1</option> <option value='2'>2</option> <option value='3'>3</option> </select> </body> </html> |
|
返回顶楼 | |
发表时间:2007-06-07
非常感谢楼上,后来我发下prototype得api中建议使用bindAsEventListener这个方法,我看了他得源码,
在bind 中返回得是 return __method.apply(object, args.concat($A(arguments))); 在bindAsEventListener中返回 return __method.apply(object, [( event || window.event)].concat(args).concat($A(arguments))); 我试了用bindAsEventListener也可以使this指向select,但区别在那,我的理解是下边这个不仅是this指向指定的元素,而且把event也带进这个方法里,也就是当在ff下event不会为undefined,不知是不是这么理解 |
|
返回顶楼 | |
发表时间:2007-06-07
campaign 写道 非常感谢楼上,后来我发下prototype得api中建议使用bindAsEventListener这个方法,我看了他得源码,
在bind 中返回得是 return __method.apply(object, args.concat($A(arguments))); 在bindAsEventListener中返回 return __method.apply(object, [( event || window.event)].concat(args).concat($A(arguments))); 我试了用bindAsEventListener也可以使this指向select,但区别在那,我的理解是下边这个不仅是this指向指定的元素,而且把event也带进这个方法里,也就是当在ff下event不会为undefined,不知是不是这么理解 完全正确 |
|
返回顶楼 | |
发表时间:2007-06-07
不对呀,我刚测过了,
(function(){ alert(this.value);alert(event);}).bindAsEventListener($('set1'))) 在ie中可以打出[object],在ff下可以打出undefiend,? 还有我想问问,[( event || window.event)].concat(args).concat($A(arguments))这种写法的意思是什么呢,concat是string的组合方法,[( event || window.event)]返回的应该是一个event对象把 ,对象的concat不理解,高手给解释一下把,谢谢了 |
|
返回顶楼 | |
发表时间:2007-06-07
campaign 写道 不对呀,我刚测过了,
(function(){ alert(this.value);alert(event);}).bindAsEventListener($('set1'))) 在ie中可以打出[object],在ff下可以打出undefiend,? 还有我想问问,[( event || window.event)].concat(args).concat($A(arguments))这种写法的意思是什么呢,concat是string的组合方法,[( event || window.event)]返回的应该是一个event对象把 ,对象的concat不理解,高手给解释一下把,谢谢了 (function(e){ alert(this.value);alert(e);}).bindAsEventListener($('set1'))) 这样写! concat是数组的方法,建议补补基础。 [( event || window.event)].concat(args).concat($A(arguments)) 其实组成一个大数组,当作参数的。 (function(a,b,c){ alert(a);alert(b);alert(c);}).bindAsEventListener($('set1'))) 这样看看。 |
|
返回顶楼 | |