解决 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 相关文章推荐
javascript Array数组对象的扩展函数代码
May 22 Javascript
如何调试异步加载页面里包含的js文件
Oct 30 Javascript
jQuery中extend函数详解
Feb 13 Javascript
javascript常用经典算法实例详解
Nov 25 Javascript
Javascrip实现文字跳动特效
Nov 27 Javascript
完美的js图片轮换效果
Feb 05 Javascript
轻松学习Javascript闭包
Mar 01 Javascript
vue v-model表单控件绑定详解
May 17 Javascript
vue实现页面加载动画效果
Sep 19 Javascript
jQuery中元素选择器(element)简单用法示例
May 14 jQuery
vue-router路由模式详解(小结)
Aug 26 Javascript
electron 安装,调试,打包的具体使用
Nov 06 Javascript
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中ob_start函数的使用说明
2013/11/11 PHP
如何使用PHP对网站验证码进行破解
2015/09/17 PHP
PHP递归获取目录内所有文件的实现方法
2016/11/01 PHP
Cookie 注入是怎样产生的
2009/04/08 Javascript
JS面向对象、prototype、call()、apply()
2009/05/14 Javascript
Jquery升级新版本后选择器的语法问题
2010/06/02 Javascript
解析Javascript中大括号“{}”的多义性
2013/12/02 Javascript
js实现按一下删除键删除整个单词附demo
2014/09/05 Javascript
JS合并数组的几种方法及优劣比较
2014/09/19 Javascript
js实现星星打分效果的方法
2020/07/05 Javascript
js简单实现竖向tab选项卡的方法
2015/05/04 Javascript
JavaScript直播评论发弹幕切图功能点集合效果代码
2016/06/26 Javascript
jquery实用技巧之输入框提示语句
2016/07/28 Javascript
AngularJs bootstrap搭载前台框架——准备工作
2016/09/01 Javascript
nodejs+express实现文件上传下载管理网站
2017/03/15 NodeJs
Vue学习笔记进阶篇之函数化组件解析
2017/07/21 Javascript
jquery树形插件zTree高级使用详解
2019/08/16 jQuery
Vue scoped及deep使用方法解析
2020/08/01 Javascript
[01:49]一目了然!DOTA2DotA快捷操作对比第二弹
2014/05/16 DOTA
零基础写python爬虫之神器正则表达式
2014/11/06 Python
python版飞机大战代码分享
2018/11/20 Python
Python实现的矩阵转置与矩阵相乘运算示例
2019/03/26 Python
Python argparse模块应用实例解析
2019/11/15 Python
python isinstance函数用法详解
2020/02/13 Python
python实现同一局域网下传输图片
2020/03/20 Python
利用CSS3实现单选框动画特效示例代码
2016/09/26 HTML / CSS
css3实现画半圆弧线的示例代码
2017/11/06 HTML / CSS
Quiksilver荷兰官方网站:冲浪和滑雪板
2019/11/16 全球购物
新闻系毕业生推荐信
2013/11/16 职场文书
秋天的图画教学反思
2014/05/01 职场文书
小学感恩教育活动总结
2014/07/07 职场文书
教师工作决心书
2015/02/04 职场文书
2015年创先争优活动总结
2015/03/27 职场文书
费用申请报告范文
2015/05/15 职场文书
画展观后感
2015/06/17 职场文书
2016年班主任培训心得体会
2016/01/07 职场文书