当前位置:首页 > JavaScript > 正文内容

event事件兼容mozilla firefox的问题

canca19年前 (2007-07-01)JavaScript375

本来一个写好了的脚本在IE下正常,可是在mozilla firefox中我们发现程序报类似如下的错误:

event is not defined

obj has no properties

原因是Firefox中使用了不同的事件对象模型,不同于IE Dom,用的是W3C Dom.

下是我在网上找到的解决方法希望对兼容Firefox浏览器的event事件有所帮助:

在FireFox下编写事件处理函数是很麻烦的事.

因为FireFox并没有 window.event . 如果要得到 event 对象,就必须要声明时间处理函数的第一个参数为event.

所以为了兼容IE与FireFox,一般的事件处理方法为:

btn.onclick=handle_btn_click;

function handle_btn_click(evt)

{

    if(evt==null)evt=window.event;//IE

    //处理事件.

}

对于简单的程序,这不算麻烦.

但对于一些复杂的程序,某写函数根本就不是直接与事件挂钩的.如果要把event传进该参数,那么所有的方法都要把event传来传去..这简直就是噩梦.

下面介绍一个解决这个麻烦事的方法,与原理.

JScript中,函数的调用是有一个 func.caller 这个属性的.

例如

function A(){

    B();

}

function B(){

    alert(B.caller);

}

如果B被A调用,那么B.caller就是A

另外,函数有一个arguments属性. 这个属性可以遍历函数当前执行的参数:

function myalert(){

    var arr=[];

    for(var i=0;i<myalert.arguments.length;i++)

      arr[i]=myalert.arguments[i];

    alert(arr.join("-"));

}

alert("hello","world",1,2,3)

就能显示 hello-world-1-2-3

(arguments的个数与调用方有关,而与函数的参数定义没有任何关系)

根据这两个属性,我们可以得到第一个函数的event对象:

btn.onclick=handle_click;

function handle_click(){

    showcontent();

}

function showcontent(){

    var evt=SearchEvent();

    if(evt&&evt.shiftKey)//如果是基于事件的调用,并且shift被按下

        window.open(global_helpurl);

    else

        location.href=global_helpurl;

}

function SearchEvent(){

    func=SearchEvent.caller;

    while(func!=null){

        var arg0=func.arguments[0];

        if(arg0){

            if(arg0.constructor==Event) // 如果就是event 对象

                return arg0;

        }

        func=func.caller;

    }

    return null;

}

这个例子使用了SearchEvent来搜索event对象. 其中 'Event' 是 FireFox 的 event.constructor .

在该例子运行时,

SearchEvent.caller就是showcontent,但是showcontent.arguments[0]是空.所以 func=func.caller 时,func变为handle_click .

handle_click 被 FireFox 调用, 虽然没有定义参数,但是被调用时,第一个参数就是event,所以handle_click.arguments[0]就是event !

针对上面的知识,我们可以结合 prototype.__defineGetter__ 来实现 window.event 在 FireFox 下的实现:

下面给出一个简单的代码.. 有兴趣的可以补充

if(window.addEventListener){

 FixPrototypeForGecko();

}

function FixPrototypeForGecko(){

 HTMLElement.prototype.__defineGetter__("runtimeStyle",element_prototype_get_runtimeStyle);

 window.constructor.prototype.__defineGetter__("event",window_prototype_get_event);

 Event.prototype.__defineGetter__("srcElement",event_prototype_get_srcElement);

}

function element_prototype_get_runtimeStyle(){

 //return style instead...

 return this.style;

}

function window_prototype_get_event(){

 return SearchEvent();

}

function event_prototype_get_srcElement(){

 return this.target;

}

function SearchEvent(){

 //IE

 if(document.all)

  return window.event;

  

 func=SearchEvent.caller;

 while(func!=null) {

  var arg0=func.arguments[0];

  if(arg0){

   if(arg0.constructor==Event)

    return arg0;

  }

  func=func.caller;

 }

 return null;

}

</body></html>

firefox 中赋予事件侦听的另类方法

  无意中发现这个,firefox 如果不是 inline 方式书写事件,得不到“当前”event(IE则可以),突然想到以属性的方式来添加事件,果然可以,不知道这算不算 W3C 的本意?以前必须在元素 inline 方式书写类似 这样的方式以参数传递的方式得到当前事件对象。

此内容由: ★点击设计★ www.djasp.Net收集整理。

点击设计,专业的网页编程资讯站点,欢迎来坐坐!)

  请记好点击设计域名:www.djasp.Net,本站内含大量网页编程教程,无聊之人难免转载此文,请访问点击设计官方网址:http://www.djasp.net/

但这样的代码与全部书写也好不了多少,也不能说是“干净”的代码。(注意下面代码中的注释)

  另外,第三个,为什么会在 alert 之后弹出下载管理器,奇怪。

JS:

<script>

window.onload=ctrlEnter;

function ctrlEnter(){

//这句是对 IE 的,firefox 这样得不到当前事件对象

//document.forms[0].bbb.onkeydown=function(){if(event.ctrlKey&&event.keyCode==13){document.forms[0].submit()}}

//这句是对 firefox 的,IE不可以这样

document.forms[0].bbb.setAttribute("onkeydown","if(event.ctrlKey&&event.keyCode==13){this.form.submit()}")

}

</script>

<body>

<div >按ctrl+enter键提交</div>

<form method="get">

<input />

<input />

<input />

</form>

页面:

<body>

<input />

<script>

document.getElementById("txtReply").onkeydown=Reply;

function Reply(){

alert(1)

}

</script>

 

原文地址:http://v2.djasp.net/Static/ns/1171.stm

扫描二维码推送至手机访问。

版权声明:本文由Ant.Master's Blog发布,如需转载请注明出处。

本文链接:https://iant.work/post/580.html

标签: JavaScript
分享给朋友:

“event事件兼容mozilla firefox的问题” 的相关文章

JavaScript 函数原型对象

    以下是一篇本人在Qzone里写下的文章,现在放到这里来,欠丑了。希望对一些初学者有一点点帮助。     今天给大家说说JavaScript中的类。类?没错。JavaScript中的函数原型对象就是OOP中人们熟悉的类。JS...

《Dom Scripting》读书笔记

  《Dom Scripting》读书笔记 Canca         最近看了一本《Jeremy Keith: DOM Scripting, Web design with JavaScript and the DOM. Apr...

javascript MailTo 邮件技巧

调用email的方法 //<a href="mailto:talantlee@126.com">Email</a>window.location.href="mailto:talantlee@126.com";myform.action="mailto:talant...

javascript IE与FireFox 一些兼容写法

1>获取控件用document.getElementById,不用document.all(FF等浏览器不支持)2><button> 会被firefox解释为提交form或者刷新页面,需要写标准<button type="button">3>使用childN...

javascrip 事件追加方法

基本方法:attachEvent(IE)/detachEvent;addEventListener( Mozilla, Netscape, Firefox)/removeEventListener在之前的邏輯判斷式的基礎上,在設計javascript的時候,可以針對瀏覽器的不同,寫出適合不同種類瀏覽...

Javascript 逻辑表达式

1>逻辑表达式    看例子:     var cc;      var  dd=new Object();      var false1="false...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。