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


Posted in Javascript onAugust 22, 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 下的实现:

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

<script>
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; 
}
</script>
</body></html>
Javascript 相关文章推荐
JQuery 绑定事件时传递参数的实现方法
Oct 13 Javascript
javascript定时保存表单数据的代码
Mar 17 Javascript
jQuery Tools tab(幻灯片)
Jul 14 Javascript
jQuery中事件对象e的事件冒泡用法示例介绍
Apr 25 Javascript
javascript基本包装类型介绍
Apr 10 Javascript
深入理解事件冒泡(Bubble)和事件捕捉(capture)
May 28 Javascript
JS实现星星评分功能实例代码(两种方法)
Jun 09 Javascript
在vue2.0中引用element-ui组件库的方法
Jun 21 Javascript
如何使用Node.js爬取任意网页资源并输出PDF文件到本地
Jun 17 Javascript
Postman参数化实现过程及原理解析
Aug 13 Javascript
微信小程序实现登录注册功能
Dec 29 Javascript
Vue操作Storage本地化存储
Apr 29 Vue.js
Javascript客户端脚本的设计和应用
Aug 21 #Javascript
让iframe框架网页在任何浏览器下自动伸缩
Aug 18 #Javascript
去除链接虚线全面分析总结
Aug 15 #Javascript
静态的动态续篇之来点XML
Aug 15 #Javascript
实用javaScript技术-屏蔽类
Aug 15 #Javascript
巧妙破除网页右键禁用的十大绝招
Aug 12 #Javascript
总结一些js自定义的函数
Aug 05 #Javascript
You might like
一个PHP的QRcode类与大家分享
2011/11/13 PHP
PHP生成RSS文件类实例
2014/12/05 PHP
php表单提交与$_POST实例分析
2015/01/26 PHP
php通过文件流方式复制文件的方法
2015/03/13 PHP
Laravel 5 框架入门(三)
2015/04/09 PHP
FF IE兼容性的修改小结
2009/09/02 Javascript
jQuery插件的写法分享
2013/06/12 Javascript
javascript垃圾收集机制与内存泄漏详细解析
2013/11/11 Javascript
基于NodeJS的前后端分离的思考与实践(四)安全问题解决方案
2014/09/26 NodeJs
jQuery中:not选择器用法实例
2014/12/30 Javascript
javascript变量声明实例分析
2015/04/25 Javascript
js实现继承的5种方式
2015/12/01 Javascript
jQuery实现的给图片点赞+1动画效果(附在线演示及demo源码下载)
2015/12/31 Javascript
javascript正则表达式总结
2016/02/29 Javascript
js中字符串编码函数escape()、encodeURI()、encodeURIComponent()区别详解
2016/04/01 Javascript
Node.js下自定义错误类型详解
2016/10/17 Javascript
Vue官网todoMVC示例代码
2018/01/29 Javascript
p5.js 毕达哥拉斯树的实现代码
2018/03/23 Javascript
聊聊Vue 中 title 的动态修改问题
2019/06/11 Javascript
json.stringify()与json.parse()的区别以及用处
2021/01/25 Javascript
[05:28]刀塔密之一:团结则存
2014/07/03 DOTA
Python实现文件复制删除
2016/04/19 Python
Python+matplotlib+numpy绘制精美的条形统计图
2018/01/02 Python
python使用rpc框架gRPC的方法
2018/08/24 Python
利用python实现AR教程
2019/11/20 Python
python调用API接口实现登陆短信验证
2020/05/10 Python
HTML5中indexedDB 数据库的使用实例
2017/05/11 HTML / CSS
珍爱生命演讲稿
2014/05/10 职场文书
学校就业推荐信范文
2014/05/19 职场文书
月度优秀员工获奖感言
2014/08/16 职场文书
离婚纠纷代理词
2015/05/23 职场文书
运动会通讯稿300字
2015/07/20 职场文书
2015年社区消防安全工作总结
2015/10/14 职场文书
商业计划书之服装
2019/09/09 职场文书
SpringBoot 集成Redis 过程
2021/06/02 Redis
从原生JavaScript到React深入理解
2022/07/23 Javascript