`
AnyRock
  • 浏览: 10371 次
  • 来自: ...
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

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

阅读更多
我在做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我是刚刚才知道的,看文章的时候看着看着就蹦出来一个不知道的新名词。唉,为什么老是出来新东西来残害老年人的智商。
分享到:
评论
20 楼 AnyRock 2007-01-18  
window.event的意思就是global.event,我认为这种方式非常好,既然没有标准不标准的说法,择其方便,是不是IE有何不妥呢。

这个event的话题我们了结了吧,我肯定是要在这个基础上兼容多浏览器的了。

netfishx,帮我解决一下那个层的zindex的问题吧。
19 楼 netfishx 2007-01-17  
标准里压根没有window.event,你说哪个标准

不过说句老实话,支持window.event的倒也不少,除了mozilla系的应该都支持。我查过opera和safari的文档,都是支持的,但是  :这只是dom0,永远不可能成为标准。
18 楼 AnyRock 2007-01-17  
function(){
event.....
}
function(e){
e....
}

这两个哪一个是标准的?
17 楼 AnyRock 2007-01-17  
引用
看来你们都没有真正看去看yui ext关于event得代码。

不好意思确实没有看,我还不知道yui ext是什么也没来得及去找,要是方便能告知哪里能找的到?

那段代码没有什么问题,能不能给一个应用的例子?
定义的时候还是有event作为参数来传递的啊。
16 楼 zkj_beyond 2007-01-17  
关于这些标准方法event.srcElement,event.target
yuiext有实现。
15 楼 zkj_beyond 2007-01-17  
看来你们都没有真正看去看yui ext关于event得代码。

yui ext做的和lz相同,只是让ie符合w3cdom标准。

yui是清爽的,但不一定是最好的。

yui :
getEvent: function(e) {
    var ev = e || window.event;
    if (!ev) {
        var c = this.getEvent.caller;
        while (c) {
            ev = c.arguments[0];
            if (ev && Event == ev.constructor) {
                break;
            }
            c = c.caller;
          }
    }

   return ev;
},
14 楼 netfishx 2007-01-17  
firefox老版本很多不合规范的东西啊(毕竟是浏览器中的第一代霸主,霸主都有这毛病),现在越来越少了。不过基本上是同时支持两套。
btw:ff的js是支持到1.7版本的,这个大概是最不规范的东西了。
13 楼 AnyRock 2007-01-17  
另外我很像知道firefox是否有不遵守w3c标准的地方,比如说这个event.srcElement,event.target,会不会有两个都没有在w3c中定义的?
12 楼 AnyRock 2007-01-17  
yui event哪里才能搞的到?
11 楼 AnyRock 2007-01-17  
zkj_beyond,这个例子是让firefox遵循IE的标准了,我这么做是要尝试一下这种变通。如果可行,那么按IE,按w3c,只要是我能够统一控制就可以了。我主要解决的是项目中对javascript的统一管理和部署的问题,不让标签中出现任何js代码。现在lib里面大部分也是遵循w3c的,因为是从整合以前的脚本开始的,所以还在慢慢的转换中。

我本来不想发这个文章,就是怕被人说笑遵循了ie的标准,嘿嘿。
10 楼 netfishx 2007-01-17  
zkj_beyond 写道
搂主这个lib最大的问题是 遵循ie的“标准“来做,而不是w3c得模型。说句你不喜欢的话,没有发展必要了。

yui ext 的event是我见过做的最清爽的。可以看看。


同感,最近才发现yui-ext,从代码风格、功能、性能、文档几个方面来看都很棒。强烈推荐!!!

被LS忽悠了 yui-ext的event是yui的event的扩展,应该说yui的event做的好嘛。
9 楼 zkj_beyond 2007-01-17  
搂主这个lib最大的问题是 遵循ie的“标准“来做,而不是w3c得模型。说句你不喜欢的话,没有发展必要了。

yui ext 的event是我见过做的最清爽的。可以看看。
8 楼 netfishx 2007-01-17  
AnyRock 写道
我准备把window.event,document.all,activexobject.....这些都给注册了.....


我觉得这样做不好,除非你肯定你的代码永远只有你自己用。
7 楼 AnyRock 2007-01-17  
我准备把window.event,document.all,activexobject.....这些都给注册了.....
6 楼 netfishx 2007-01-17  
AnyRock 写道
哦,你说的第二点是不是第三点啊?不能用window.event来判断,因为这时候window.event肯定是存在的,我自己定义了一个嘛....看来应该在第一次做window.event判断的时候注册一个全局对象来记录这些个判断,谢谢netfishx的提醒!

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


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

对多浏览器的支持实在是很麻烦,你说的两种办法都有必要。
5 楼 AnyRock 2007-01-17  
哦,你说的第二点是不是第三点啊?不能用window.event来判断,因为这时候window.event肯定是存在的,我自己定义了一个嘛....看来应该在第一次做window.event判断的时候注册一个全局对象来记录这些个判断,谢谢netfishx的提醒!

另外,我很想知道,大家在开发js的部分的时候,用什么工作方式,来保证对多浏览器的支持?比如说是手头有各个vm的参考,或者用各个浏览器都做一下单元测试?
4 楼 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底下是会出错的。



3 楼 AnyRock 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的关注。
2 楼 netfishx 2007-01-16  
另外,提醒一下,不要用document.all来做浏览器判断。
1 楼 netfishx 2007-01-16  
有必要这么麻烦吗?这样不就可以了:
function(event){
event = (event)?event:window.event;
...
}

相关推荐

Global site tag (gtag.js) - Google Analytics