解决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 Flash插入函数免激活代码
Mar 31 Javascript
javascript中的继承实例代码
Apr 27 Javascript
jquery内置验证(validate)使用方法示例(表单验证)
Dec 04 Javascript
容易造成JavaScript内存泄露几个方面
Sep 04 Javascript
JQuery设置时间段下拉选择实例
Dec 30 Javascript
JS实现slide文字框缩放伸展效果代码
Nov 05 Javascript
jQuery侧边栏实现代码
May 06 Javascript
jQuery validata插件实现方法
Jun 25 jQuery
在Vue组件化中利用axios处理ajax请求的使用方法
Aug 25 Javascript
webpack打包react项目的实现方法
Jun 21 Javascript
如何在Angular8.0下使用ngx-translate进行国际化配置
Jul 24 Javascript
基于javascript处理二进制图片流过程详解
Jun 08 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
最令PHP初学者们头痛的十四个问题
2007/01/15 PHP
Zend Framework连接Mysql数据库实例分析
2016/03/19 PHP
关于Mozilla浏览器不支持innerText的解决办法
2011/01/01 Javascript
JavaScript中数组的排序、乱序和搜索实现代码
2011/11/30 Javascript
JS中的异常处理方法分享
2013/12/22 Javascript
js根据日期判断星座的示例代码
2014/01/23 Javascript
jQuery插件 Jqplot图表实例
2016/06/18 Javascript
jQuery简单实现MD5加密的方法
2017/03/03 Javascript
Angular4学习笔记之实现绑定和分包
2017/08/01 Javascript
详解vue 数据传递的方法
2018/04/19 Javascript
vue.js实现二级菜单效果
2019/10/19 Javascript
Vue可自定义tab组件用法实例
2019/10/24 Javascript
vue实现评价星星功能
2020/06/30 Javascript
[46:27]DOTA2上海特级锦标赛主赛事日 - 1 胜者组第一轮#2LGD VS MVP.Phx第一局
2016/03/02 DOTA
在Python中测试访问同一数据的竞争条件的方法
2015/04/23 Python
Python实现Windows和Linux之间互相传输文件(文件夹)的方法
2017/05/08 Python
Python+OpenCV让电脑帮你玩微信跳一跳
2018/01/04 Python
numpy找出array中的最大值,最小值实例
2018/04/03 Python
朴素贝叶斯分类算法原理与Python实现与使用方法案例
2018/06/26 Python
解决Python3.5+OpenCV3.2读取图像的问题
2018/12/05 Python
在pycharm中使用git版本管理以及同步github的方法
2019/01/16 Python
Python读入mnist二进制图像文件并显示实例
2020/04/24 Python
python多进程使用函数封装实例
2020/05/02 Python
python编写softmax函数、交叉熵函数实例
2020/06/11 Python
Elizabeth Gage官网:英国最好的珠宝设计之一
2020/09/26 全球购物
办公室年终个人自我评价
2013/10/28 职场文书
城市规划应届毕业生自荐信
2014/07/04 职场文书
群众路线剖析材料
2014/09/30 职场文书
个人存款证明书
2014/10/18 职场文书
财政局长个人总结
2015/03/04 职场文书
2015年教师节贺卡寄语
2015/03/24 职场文书
2015年财政所工作总结
2015/04/25 职场文书
2015年幼儿教育工作总结
2015/07/24 职场文书
Python实战之疫苗研发情况可视化
2021/05/18 Python
不同品牌、不同型号对讲机如何互相通联
2022/02/18 无线电
关于EntityWrapper的in用法
2022/03/22 Java/Android