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

处理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;
...
}

相关推荐

    火狐浏览器不支持window.event的解决办法

    火狐浏览器不支持window.event的解决办法,解决不同浏览器针对window.event的差异

    火狐下window.event回车改Tab解决方案

    本文将详细介绍如何在Firefox(火狐)浏览器中将用户按下回车键的行为转换为按下Tab键的效果。此方案主要适用于那些希望增强用户体验、提供更加流畅表单填写流程的应用程序。 #### 背景介绍 在不同的浏览器环境下,...

    网页右键ie不支持event.preventDefault和event.returnValue (需要加window)

    如果不支持,那么我们假设是在IE浏览器中,直接设置`window.event.returnValue`为`false`来阻止默认行为。 需要注意的是,`window.event`在IE中是全局对象,可以直接访问到当前的事件。而在其他非IE浏览器中,事件...

    window.event快达到全浏览器支持了,以后使用就方便了

    然而,在早期的非IE浏览器中,如Firefox、Chrome、Safari和Opera,并不直接支持`window.event`,它们通常会将事件对象作为事件处理函数的第一个参数传递,如`function(event)`中的`event`。 标题和描述中提到的情况...

    window.event.keyCode兼容IE和Firefox实现js代码

    Javascript 代码 代码如下: function keyNumAll(evt){ //兼容IE和Firefox获得keyBoardEvent对象 evt = (evt) ? evt : ((window.event) ? window.event : “”); var key = evt.keyCode?evt.keyCode:evt.which;//...

    js事件源window.event.srcElement兼容性写法(详解)

    在IE浏览器中,我们可以通过window.event.srcElement属性来访问事件源,但在Firefox等其他浏览器中,这一属性是不存在的,因此需要寻找兼容性写法。这篇文档便是对window.event.srcElement属性及其兼容性写法的详细...

    让Firefox支持event对象实现代码

    然而,Firefox并不支持`window.event`,而是将事件对象作为事件处理函数的第一个参数传递。 为了在Firefox中获取事件对象,开发者通常需要像这样编写事件处理函数: ```javascript btn.onclick = handle_btn_click...

    Mozzila Firefox与IE的兼容问题

    在IE中,window.event可以正确执行,但是在Firefox中却不可以。解决方法是将window.event改为事件对象evt,例如: 原代码:提交" onclick="javascript:gotoSubmit()"/&gt; function gotoSubmit() { ... alert...

    event兼容调用(IE,Firefox,Chrome)

    Firefox则不支持直接通过`window.event`来访问事件对象。在Firefox中,事件对象是作为事件处理函数的第一个参数传递进来的。因此,如果尝试在Firefox中访问`window.event`,将会得到`undefined`的结果。 为了在Fire...

    ie 和 firefox 的javascript 兼容问题(网上下载的).doc

    - **Firefox环境下**,不支持 `window.event`,必须在事件处理函数中传递事件对象。 **解决方法:** 使用以下代码实现跨浏览器兼容: ```javascript function gotoSubmit8_2(evt) { evt = evt ? evt : (window....

    兼容IE和Firefox获得keyBoardEvent对象

    )来代替IE下的event.srcElement或者Firefox下的event.target。请同时注意event的兼容性问题。 11. window.location.href问题 IE或者Firefox2.0.x可以使用window.location或window.location.href;Firefox1.5.x只能...

    firefox兼容性问题

    然而,Firefox在早期版本中对`event`的全局作用域支持并不完全,不像其他一些浏览器(如Chrome、Safari和IE),它们允许在没有明确参数的情况下直接在事件处理函数内部使用`event`。这可能导致在Firefox中编写的一些...

    Javascript的IE和Firefox兼容性汇编 .txt

    - Firefox和其他浏览器中没有 `event.x` 和 `event.y`,而提供了 `event.pageX` 和 `event.pageY`。 - 为了解决这一差异,可以采用以下方式获取坐标值: ```javascript var mX = event.pageX || event.clientX +...

    JavaScript在IE和Firefox(火狐)的不兼容问题解决

    标题与描述均聚焦于“JavaScript在IE和Firefox(火狐)的不兼容问题解决”,这表明文章旨在探讨并提供解决方案来处理在不同浏览器环境下的JavaScript兼容性问题,尤其是在Internet Explorer(IE)和Mozilla Firefox...

    Javascript的IE和Firefox兼容性.doc

    - IE支持全局变量`window.event`来访问当前事件的信息,但在Firefox中,事件对象只能在事件处理函数内部访问。为了解决这个问题,可以在事件处理函数中传递`event`参数,例如: ```html 提交" onclick=...

    window.event.srcElement 得到事件源对象

    在非IE浏览器中,如Firefox、Chrome、Safari等,你应该使用`event.target`来获取触发事件的元素,因为`window.event`在这些浏览器中并不可用。为了确保代码的跨浏览器兼容性,可以这样写: ```javascript function ...

    js firefox支持问题

    本文将深入探讨这些差异,帮助开发者更好地理解和解决在Firefox和IE中常见的JavaScript支持问题。 #### 1. 表单元素访问方法 在JavaScript中访问表单元素有多种方法,但在不同的浏览器中,这些方法的表现并不一致...

Global site tag (gtag.js) - Google Analytics