精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2007-01-16
Jskit.org(一套自己的javascript工具包)的时候,绑定事件,或者触发事件绑定的方法,都是在方法内使用event的,但是用到firefox的时候发现firefox没有这个全局的event,只有在事件发生之后才会出现event对象。我使用了如下的方式来解决:
我在做//首先,定义一个全局的event if( typeof(window.event)=="undefined" ){ eval("var event = new Object;"); } // Firefox Event << IE Event // bind ie's methods on firefox function jskitFFEvent(e){ if( typeof(document.all)=="undefined" ){ event = e; event.srcElement = e.target; } return true; }; //然后在绑定事件的地方: if ( typeof(document.all)=="undefined" ) {//for Firefox var _eventName = rName.replace(/on(.*)/i,'$1'); eval("_bk = rObj.addEventListener(\""+_eventName+"\", function(){jskitFFEvent(event);"+rHandler+"();}, true);"); } else{//for IE eval("_bk = rObj.attachEvent(\""+rName+"\","+ rHandler+");"); } //这里rHandler是传递过来的方法名 //调用的方式形如: jskitEvents.add(myElement,"onclick","myClass.onclick"); //该方式还可以给绑定事件传递参数,只不过暂时我还没有用到,所以没写那么多。 使用了这样的方式之后,以前在函数内用的event.srcElement都不想要在改动了。我想类似的方式也能解决其他firefox与ie兼容的问题吧,把对象重构,把不兼容的地方抽出来之前解决,做一个对应的转换,以后的代码都不需要再做修改或者不用每次都要做两态判断的处理(后一种情况让我非常头疼)。 我现在做的工作是不要在页面中(主要是标签中)写任何js代码,所有的js脚本都通过配置和部署来应用,让js自己来判断该去绑定谁,该去执行什么,页面只负责src的引用。 JavaEye我是刚刚才知道的,看文章的时候看着看着就蹦出来一个不知道的新名词。唉,为什么老是出来新东西来残害老年人的智商。 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2007-01-16
有必要这么麻烦吗?这样不就可以了:
function(event){ event = (event)?event:window.event; ... } |
|
返回顶楼 | |
发表时间:2007-01-16
另外,提醒一下,不要用document.all来做浏览器判断。
|
|
返回顶楼 | |
发表时间:2007-01-16
谢谢netfishx的提醒。我解释一下:
1,不能做function(event),不能显式的传递event值,或者说不可以依赖event的参数。我觉得IE有window.event非常好,不知道为什么firefox不支持。我是非常不能接受没有变化的还必须带着的参数的这种重复,每次处理事件都要雷打不动的放一个一模一样的event做参数,既然都一样应该提出来。 2,不在具体的方法中做两态判断。我觉得用到了具体的地方总是做一下这种判断会成开发上的灾难。而且以后也很不好维护。如果FireFox和IE之间又有了其他的差别,还要去检查里面的代码。 因此,为解决以上两个问题才搞这么复杂,当然代码写的是非常粗糙的。 3,document.all这个是可以替换的,判断浏览器是没有意义的,没准哪天出来一个Firedog是支持document.all的而useragent跟IE完全不一样。我只是判断vm。支持document.all的vm和不支持document.all的vm。当然这个也是很不严谨的,暂且这样来写。 再次感谢netfishx的关注。 |
|
返回顶楼 | |
发表时间:2007-01-16
AnyRock 写道 谢谢netfishx的提醒。我解释一下:
1,不能做function(event),不能显式的传递event值,或者说不可以依赖event的参数。我觉得IE有window.event非常好,不知道为什么firefox不支持。我是非常不能接受没有变化的还必须带着的参数的这种重复,每次处理事件都要雷打不动的放一个一模一样的event做参数,既然都一样应该提出来。 2,不在具体的方法中做两态判断。我觉得用到了具体的地方总是做一下这种判断会成开发上的灾难。而且以后也很不好维护。如果FireFox和IE之间又有了其他的差别,还要去检查里面的代码。 因此,为解决以上两个问题才搞这么复杂,当然代码写的是非常粗糙的。 3,document.all这个是可以替换的,判断浏览器是没有意义的,没准哪天出来一个Firedog是支持document.all的而useragent跟IE完全不一样。我只是判断vm。支持document.all的vm和不支持document.all的vm。当然这个也是很不严谨的,暂且这样来写。 再次感谢netfishx的关注。 第一点,完全同意。我上面的方法只是举例,没必要在每个具体的方法里都这样写,提取出来就是了。 第二点,我想你误解了我的意思。我们都知道做浏览器判断没有意义,只是提醒你在这里做对象判断完全可以用window.event是否存在来代替。顺便再说一句,你后面的“没准”根本就是事实:opera就支持document.all。so,你的对象在opera底下是会出错的。 |
|
返回顶楼 | |
发表时间:2007-01-17
哦,你说的第二点是不是第三点啊?不能用window.event来判断,因为这时候window.event肯定是存在的,我自己定义了一个嘛....看来应该在第一次做window.event判断的时候注册一个全局对象来记录这些个判断,谢谢netfishx的提醒!
另外,我很想知道,大家在开发js的部分的时候,用什么工作方式,来保证对多浏览器的支持?比如说是手头有各个vm的参考,或者用各个浏览器都做一下单元测试? |
|
返回顶楼 | |
发表时间:2007-01-17
AnyRock 写道 哦,你说的第二点是不是第三点啊?不能用window.event来判断,因为这时候window.event肯定是存在的,我自己定义了一个嘛....看来应该在第一次做window.event判断的时候注册一个全局对象来记录这些个判断,谢谢netfishx的提醒!
另外,我很想知道,大家在开发js的部分的时候,用什么工作方式,来保证对多浏览器的支持?比如说是手头有各个vm的参考,或者用各个浏览器都做一下单元测试? 哦,你说的对,是我不仔细。我觉得针对IE浏览器最好的对象判断是ActiveXObject,这个东西其他浏览器肯定不会实现。 对多浏览器的支持实在是很麻烦,你说的两种办法都有必要。 |
|
返回顶楼 | |
发表时间:2007-01-17
我准备把window.event,document.all,activexobject.....这些都给注册了.....
|
|
返回顶楼 | |
发表时间:2007-01-17
AnyRock 写道 我准备把window.event,document.all,activexobject.....这些都给注册了.....
我觉得这样做不好,除非你肯定你的代码永远只有你自己用。 |
|
返回顶楼 | |
发表时间:2007-01-17
搂主这个lib最大的问题是 遵循ie的“标准“来做,而不是w3c得模型。说句你不喜欢的话,没有发展必要了。
yui ext 的event是我见过做的最清爽的。可以看看。 |
|
返回顶楼 | |