解决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 相关文章推荐
FCK调用方法..
Dec 21 Javascript
鼠标事件的screenY,pageY,clientY,layerY,offsetY属性详解
Mar 12 Javascript
浅谈Javascript实现继承的方法
Jul 06 Javascript
实例解析JS布尔对象的toString()方法和valueOf()方法
Oct 25 Javascript
利用Javascript获取选择文本所在的句子详解
Dec 03 Javascript
vue.js使用v-pre与v-html输出HTML操作示例
Jul 07 Javascript
微信小程序实现简单评论功能
Nov 28 Javascript
总结4个方面优化Vue项目
Feb 11 Javascript
使用webpack搭建vue项目及注意事项
Jun 10 Javascript
vue操作dom元素的3种方法示例
Sep 20 Javascript
Vue实现穿梭框效果
Sep 30 Javascript
javascript实现滚轮轮播图片
Dec 13 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
ThinkPHP模板Volist标签嵌套循环输出多维数组的方法
2016/03/23 PHP
PHP批量删除jQuery操作
2017/07/23 PHP
JavaScript表单常用验证集合
2008/01/16 Javascript
jquery的ajaxSubmit()异步上传图片并保存表单数据演示代码
2013/06/04 Javascript
jquery mobile的触控点击事件会多次触发问题的解决方法
2014/05/08 Javascript
jQuery中on()方法用法实例
2015/01/19 Javascript
JQuery异步获取返回值中文乱码的解决方法
2015/01/29 Javascript
使用Meteor配合Node.js编写实时聊天应用的范例
2015/06/23 Javascript
理解 JavaScript Scoping &amp; Hoisting(二)
2015/11/18 Javascript
js匿名函数作为函数参数详解
2016/06/01 Javascript
浅谈js中test()函数在正则中的使用
2016/08/19 Javascript
jQuery ajaxForm()的应用
2016/10/14 Javascript
JS实现图片上传预览功能
2016/11/21 Javascript
Vuex2.0+Vue2.0构建备忘录应用实践
2016/11/30 Javascript
vue-cli如何添加less 以及sass
2017/07/06 Javascript
微信小程序实现即时通信聊天功能的实例代码
2018/08/17 Javascript
JS实现电话号码的字母组合算法示例
2019/02/26 Javascript
Vue源码解析之数据响应系统的使用
2019/04/24 Javascript
[19:14]DOTA2 HEROS教学视频教你分分钟做大人-维萨吉
2014/06/24 DOTA
Python实现的ini文件操作类分享
2014/11/20 Python
Python实现感知机(PLA)算法
2017/12/20 Python
python 判断网络连通的实现方法
2018/04/22 Python
python使用turtle库绘制时钟
2020/03/25 Python
python3获取当前目录的实现方法
2019/07/29 Python
tensorflow如何批量读取图片
2019/08/29 Python
Python生成验证码、计算具体日期是一年中的第几天实例代码详解
2019/10/16 Python
HTML5+Canvas+CSS3实现齐天大圣孙悟空腾云驾雾效果
2016/04/26 HTML / CSS
统计系教授推荐信
2014/02/28 职场文书
电视购物广告词
2014/03/19 职场文书
学校安全防火方案
2014/06/07 职场文书
干部作风建设个人剖析材料
2014/10/11 职场文书
党员干部对十八届四中全会的期盼
2014/10/17 职场文书
销售员岗位职责范本
2015/04/11 职场文书
赤壁观后感(2)
2015/06/15 职场文书
结婚喜宴祝酒词
2015/08/10 职场文书
Js类的构建与继承案例详解
2021/09/15 Javascript