解决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 相关文章推荐
js判断输入是否为正整数、浮点数等数字的函数代码
Nov 17 Javascript
JavaScript计算字符串中每个字符出现次数的小例子
Jul 02 Javascript
微信小程序 WebSocket详解及应用
Jan 21 Javascript
vue多页面开发和打包正确处理方法
Apr 20 Javascript
jQuery实现动态加载select下拉列表项功能示例
May 31 jQuery
Vue弹出菜单功能的实现代码
Sep 12 Javascript
angular 服务的单例模式(依赖注入模式下)详解
Oct 22 Javascript
JQuery实现ajax请求的示例和注意事项
Dec 10 jQuery
Vue 报错TypeError: this.$set is not a function 的解决方法
Dec 17 Javascript
JavaScript数组去重的几种方法
Apr 07 Javascript
Angular请求防抖处理第一次请求失效问题
May 17 Javascript
vue使用Sass时报错问题的解决方法
Oct 14 Javascript
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
通过ODBC连接的SQL SERVER实例
2006/10/09 PHP
php中将图片gif,jpg或mysql longblob或blob字段值转换成16进制字符串
2011/08/23 PHP
PHP删除数组中空值的方法介绍
2014/04/14 PHP
PHP防盗链代码实例
2014/08/27 PHP
php基于mcrypt的加密解密实例
2014/10/27 PHP
PHP并发场景的三种解决方案代码实例
2021/02/27 PHP
基于Jquery的动态添加控件并取值的实现代码
2010/09/24 Javascript
jquery获取元素值的方法(常见的表单元素)
2013/11/15 Javascript
浅谈JavaScript字符集
2014/05/22 Javascript
js实现图片放大和拖拽特效代码分享
2015/09/05 Javascript
浅谈javascript函数式编程
2015/09/06 Javascript
详解jQuery Mobile自定义标签
2016/01/06 Javascript
js实现的二分查找算法实例
2016/01/21 Javascript
JavaScript继承定义与用法实践分析
2018/05/28 Javascript
three.js实现圆柱体
2018/12/30 Javascript
浅谈JS和jQuery的区别
2019/03/27 jQuery
javascript实现简单页面倒计时
2021/03/02 Javascript
[58:15]2018DOTA2亚洲邀请赛 4.1 小组赛 A组 NB vs Liquid
2018/04/02 DOTA
布同 Python中文问题解决方法(总结了多位前人经验,初学者必看)
2011/03/13 Python
Python模块汇总(常用第三方库)
2019/10/07 Python
python保留小数位的三种实现方法
2020/01/07 Python
Django admin管理工具TabularInline类用法详解
2020/05/14 Python
详解Pycharm与anaconda安装配置指南
2020/08/25 Python
解决Python3.7.0 SSL低版本导致Pip无法使用问题
2020/09/03 Python
全面介绍python中很常用的单元测试框架unitest
2020/12/14 Python
HTML5 progress和meter控件_动力节点Java学院整理
2017/07/06 HTML / CSS
英国时尚女装购物网站:Missguided
2018/08/23 全球购物
销售工作人员的自我评价分享
2013/11/10 职场文书
大四毕业生自荐书
2014/07/05 职场文书
关于诚信的活动方案
2014/08/18 职场文书
创先争优活动心得体会
2014/09/04 职场文书
个人存款证明书
2014/10/18 职场文书
戒赌保证书
2015/05/11 职场文书
使用springboot暴露oracle数据接口的问题
2021/05/07 Oracle
java解析XML详解
2021/07/09 Java/Android
JavaScript 与 TypeScript之间的联系
2021/11/27 Javascript