论坛首页 Web前端技术论坛

处理firefox不支持window.event的问题

浏览 26070 次
精华帖 (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我是刚刚才知道的,看文章的时候看着看着就蹦出来一个不知道的新名词。唉,为什么老是出来新东西来残害老年人的智商。
   发表时间:2007-01-16  
有必要这么麻烦吗?这样不就可以了:
function(event){
event = (event)?event:window.event;
...
}
0 请登录后投票
   发表时间:2007-01-16  
另外,提醒一下,不要用document.all来做浏览器判断。
0 请登录后投票
   发表时间: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的关注。
0 请登录后投票
   发表时间: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底下是会出错的。



0 请登录后投票
   发表时间:2007-01-17  
哦,你说的第二点是不是第三点啊?不能用window.event来判断,因为这时候window.event肯定是存在的,我自己定义了一个嘛....看来应该在第一次做window.event判断的时候注册一个全局对象来记录这些个判断,谢谢netfishx的提醒!

另外,我很想知道,大家在开发js的部分的时候,用什么工作方式,来保证对多浏览器的支持?比如说是手头有各个vm的参考,或者用各个浏览器都做一下单元测试?
0 请登录后投票
   发表时间:2007-01-17  
AnyRock 写道
哦,你说的第二点是不是第三点啊?不能用window.event来判断,因为这时候window.event肯定是存在的,我自己定义了一个嘛....看来应该在第一次做window.event判断的时候注册一个全局对象来记录这些个判断,谢谢netfishx的提醒!

另外,我很想知道,大家在开发js的部分的时候,用什么工作方式,来保证对多浏览器的支持?比如说是手头有各个vm的参考,或者用各个浏览器都做一下单元测试?


哦,你说的对,是我不仔细。我觉得针对IE浏览器最好的对象判断是ActiveXObject,这个东西其他浏览器肯定不会实现。

对多浏览器的支持实在是很麻烦,你说的两种办法都有必要。
0 请登录后投票
   发表时间:2007-01-17  
我准备把window.event,document.all,activexobject.....这些都给注册了.....
0 请登录后投票
   发表时间:2007-01-17  
AnyRock 写道
我准备把window.event,document.all,activexobject.....这些都给注册了.....


我觉得这样做不好,除非你肯定你的代码永远只有你自己用。
0 请登录后投票
   发表时间:2007-01-17  
搂主这个lib最大的问题是 遵循ie的“标准“来做,而不是w3c得模型。说句你不喜欢的话,没有发展必要了。

yui ext 的event是我见过做的最清爽的。可以看看。
0 请登录后投票
论坛首页 Web前端技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics