解决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 相关文章推荐
jquery.alert 弹出式复选框实现代码
Jun 15 Javascript
jQuery Ajax之load()方法
Oct 12 Javascript
jquery插件制作 图片走廊 gallery
Aug 17 Javascript
用jquery实现输入框获取焦点消失文字
Apr 27 Javascript
javascript轻量级模板引擎juicer使用指南
Jun 22 Javascript
javascript包装对象实例分析
Mar 27 Javascript
深入理解JS正则表达式---分组
Jul 18 Javascript
如何用js判断dom是否有存在某class的值
Feb 13 Javascript
详解webpack 配合babel 将es6转成es5 超简单实例
May 02 Javascript
微信小程序云开发如何使用npm安装依赖
May 18 Javascript
微信小程序去除左上角返回键的实现方法
Mar 06 Javascript
react 生命周期实例分析
May 18 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
overlord人气高涨,却被菲利普频繁举报,第四季很难在国内上映
2020/05/06 日漫
PHP 截取字符串 分别适合GB2312和UTF8编码情况
2009/02/12 PHP
使用php来实现网络服务
2009/09/15 PHP
创建数据库php代码 用PHP写出自己的BLOG系统
2010/04/12 PHP
九个你必须知道而且又很好用的php函数和特点
2013/08/08 PHP
smarty中post用法实例
2014/11/28 PHP
php+js实现百度地图多点标注的方法
2016/11/30 PHP
[原创]php实现 data url的图片生成与保存
2016/12/04 PHP
PHP封装的验证码工具类定义与用法示例
2018/08/22 PHP
Flex通过JS获取客户端IP和计算机名的实例代码
2013/11/21 Javascript
jquery对元素拖动排序示例
2014/01/16 Javascript
jquery实现类似EasyUI的页面布局可改变左右的宽度
2020/09/12 Javascript
JavaScript设计模式之建造者模式介绍
2014/12/28 Javascript
jquery中ajax跨域方法实例分析
2015/12/18 Javascript
BootStrap实现邮件列表的分页和模态框添加邮件的功能
2016/10/13 Javascript
JavaScript中校验银行卡号的实现代码
2016/12/19 Javascript
JS实现控制图片显示大小的方法【图片等比例缩放功能】
2017/02/18 Javascript
JS 插件dropload下拉刷新、上拉加载使用小结
2017/04/13 Javascript
AngularJS日期格式化常见操作实例分析
2018/05/17 Javascript
jQuery实现常见的隐藏与展示列表效果示例
2018/06/04 jQuery
JS实现的新闻列表自动滚动效果示例
2019/01/30 Javascript
Python中Continue语句的用法的举例详解
2015/05/14 Python
Python yield 使用浅析
2015/05/28 Python
解决Pycharm无法import自己安装的第三方module问题
2018/05/18 Python
DRF跨域后端解决之django-cors-headers的使用
2019/01/27 Python
Python中Numpy ndarray的使用详解
2019/05/24 Python
美国最大的城市服装和运动鞋零售商:Jimmy Jazz
2016/11/19 全球购物
银行存款证明样本
2014/01/17 职场文书
《莫高窟》教学反思
2014/02/25 职场文书
股份合作协议书范本
2014/04/14 职场文书
农业开发项目建议书
2014/05/16 职场文书
演讲稿的写法
2014/05/19 职场文书
2014年秋季开学寄语
2014/08/02 职场文书
临床医学生职业规划书范文
2014/10/25 职场文书
毕业酒会致辞
2015/07/29 职场文书
MySQL表类型 存储引擎 的选择
2021/11/11 MySQL