解决FireFox下[使用event很麻烦]的问题


Posted in Javascript onNovember 26, 2006

在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
        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>

Javascript 相关文章推荐
javascript DOM编程实例(智播客学习)
Nov 23 Javascript
JavaScript 一道字符串分解的题目
Aug 03 Javascript
js 动态加载事件的几种方法总结
Dec 25 Javascript
jquery如何把数组变为字符串传到服务端并处理
Apr 30 Javascript
浅谈JavaScript中运算符的优先级
Jul 07 Javascript
JavaScript实现弹出DIV层同时页面背景渐变成半透明效果
Mar 25 Javascript
Vuejs第十三篇之组件——杂项
Sep 09 Javascript
原生JS实现层叠轮播图
May 17 Javascript
JavaScript无操作后屏保功能的实现方法
Jul 04 Javascript
js实现简单的无缝轮播效果
Sep 05 Javascript
浅谈vant组件Picker 选择器选单选问题
Nov 04 Javascript
vue 使用class创建和清除水印的示例代码
Dec 25 Vue.js
DHTML 中的绝对定位
Nov 26 #Javascript
js验证表单第二部分
Nov 25 #Javascript
js验证表单大全
Nov 25 #Javascript
禁止刷新,回退的JS
Nov 25 #Javascript
用函数式编程技术编写优美的 JavaScript
Nov 25 #Javascript
通过JAVASCRIPT读取ASP设定的COOKIE
Nov 24 #Javascript
键盘控制事件应用教程大全
Nov 24 #Javascript
You might like
php获取字段名示例分享
2014/03/03 PHP
php微信开发之谷歌测距
2018/06/14 PHP
Yii2.0 RESTful API 基础配置教程详解
2018/12/26 PHP
PHP常用header头定义代码示例汇总
2020/08/29 PHP
jQuery MD5加密实现代码
2010/03/15 Javascript
js/jQuery对象互转(快速操作dom元素)
2013/02/04 Javascript
JS获得URL超链接的参数值实例代码
2013/06/21 Javascript
js string 转 int 注意的问题小结
2013/08/15 Javascript
火狐下table中创建form导致两个table之间出现空白
2013/09/02 Javascript
js检验密码强度(低中高)附图
2014/06/05 Javascript
JS获取iframe中longdesc属性的方法
2015/04/01 Javascript
在JavaScript中操作时间之setYear()方法的使用
2015/06/12 Javascript
Javascript之String对象详解
2016/06/08 Javascript
微信小程序 POST请求(网络请求)详解及实例代码
2016/11/16 Javascript
jQuery基于ajax方式实现用户名存在性检查功能示例
2017/02/10 Javascript
6行代码实现微信小程序页面返回顶部效果
2018/12/28 Javascript
基于vue+echarts数据可视化大屏展示的实现
2020/12/25 Vue.js
[03:39]这就是刀塔,我们是冠军!燃情短片讲述我们的DOTA故事
2019/07/02 DOTA
python远程登录代码
2008/04/29 Python
Python实现的一个简单LRU cache
2014/09/26 Python
Python中的super()方法使用简介
2015/08/14 Python
浅析python中的分片与截断序列
2016/08/09 Python
python简单实现AES加密和解密
2019/03/28 Python
python使用rsa非对称加密过程解析
2019/12/28 Python
Python如何实现自带HTTP文件传输服务
2020/07/08 Python
Python中logger日志模块详解
2020/08/04 Python
localStorage、sessionStorage使用总结
2017/11/17 HTML / CSS
iostream与iostream.h的区别
2015/01/16 面试题
中秋节主持词
2014/04/02 职场文书
安全生产计划书
2014/05/04 职场文书
工作违纪检讨书范文
2015/01/26 职场文书
求职简历自荐信怎么写
2015/03/26 职场文书
2015年全国助残日活动方案
2015/05/04 职场文书
安娜卡列尼娜观后感
2015/06/11 职场文书
Python开发工具Pycharm的安装以及使用步骤总结
2021/06/24 Python
python使用pycharm安装pyqt5以及相关配置
2022/04/22 Python