解决 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的DIV随滚动条滚动而滚动的代码
Jul 20 Javascript
javascript动态创建链接的方法
May 13 Javascript
jquery实现鼠标滑过后动态图片提示效果实例
Aug 10 Javascript
Vue.JS入门教程之自定义指令
Dec 08 Javascript
js仿淘宝评价评分功能
Feb 28 Javascript
VUE长按事件需求详解
Oct 18 Javascript
微信小程序实现多个按钮的颜色状态转换
Feb 15 Javascript
JS module的导出和导入的实现代码
Feb 25 Javascript
详解微信小程序中var、let、const用法与区别
Jan 11 Javascript
Node使用Nodemailer发送邮件的方法实现
Feb 24 Javascript
javascript设计模式 ? 简单工厂模式原理与应用实例分析
Apr 09 Javascript
JavaScript函数重载操作实例浅析
May 02 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
Sony CFR 320 修复改造
2020/03/14 无线电
phpMyAdmin 安装及问题总结
2009/05/28 PHP
php 阴历-农历-转换类代码
2012/01/16 PHP
php实现图形显示Ip地址的代码及注释
2014/01/20 PHP
PHP实现更改hosts文件的方法示例
2017/08/08 PHP
用JavaScrpt实现文件夹简单轻松加密的实现方法图文
2008/09/08 Javascript
JavaScript面向对象之静态与非静态类
2010/02/03 Javascript
Firefox下提示illegal character并出现乱码的原因
2010/03/25 Javascript
Jquery 滑入滑出效果实现代码
2010/03/27 Javascript
基于jquery的使ListNav兼容中文首字拼音排序的实现代码
2011/07/10 Javascript
JavaScript中OnLoad几种使用方法
2012/12/15 Javascript
JavaScript作用域链示例分享
2014/05/27 Javascript
使用javascript实现Iframe自适应高度
2014/12/24 Javascript
认识Knockout及如何使用Knockout绑定上下文
2015/12/25 Javascript
不定义JQuery插件 不要说会JQuery
2016/03/07 Javascript
jQuery文本框得到与失去焦点动态改变样式效果
2016/09/08 Javascript
prototype与__proto__区别详细介绍
2017/01/09 Javascript
简单实现jQuery级联菜单
2017/01/09 Javascript
js操作浏览器的参数方法
2017/01/21 Javascript
深入剖析Express cookie-parser中间件实现示例
2018/02/01 Javascript
node.js中process进程的概念和child_process子进程模块的使用方法示例
2020/02/11 Javascript
Python输出PowerPoint(ppt)文件中全部文字信息的方法
2015/04/28 Python
python实现读取命令行参数的方法
2015/05/22 Python
python 3.5实现检测路由器流量并写入txt的方法实例
2017/12/17 Python
详解Python sys.argv使用方法
2019/05/10 Python
python如何使用socketserver模块实现并发聊天
2019/12/14 Python
Python hashlib加密模块常用方法解析
2019/12/18 Python
Python就将所有的英文单词首字母变成大写
2021/02/12 Python
Mio Skincare法国官网:身体紧致及孕期身体护理
2018/04/04 全球购物
金属材料工程毕业生个人的自我评价
2013/11/28 职场文书
汽车维修专业个人求职信范文
2014/01/01 职场文书
运动会跳远广播稿
2014/02/04 职场文书
旅行社各个岗位职责
2014/03/15 职场文书
平安家庭示范户事迹
2014/06/02 职场文书
传承焦裕禄精神思想汇报2014
2014/09/10 职场文书
2015年创先争优工作总结
2015/05/23 职场文书