解决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 checkbox全选/取消全选实现代码
Nov 14 Javascript
cnblogs中在闪存中屏蔽某人的实现代码
Nov 14 Javascript
jQuery AjaxQueue改进步骤
Oct 06 Javascript
选择器中含有空格在使用示例及注意事项
Jul 31 Javascript
jQuery中验证表单提交方式及序列化表单内容的实现
Jan 06 Javascript
使用jQuery中的wrap()函数操作HTML元素的教程
May 24 Javascript
jQuery Validate验证表单时多个name相同的元素只验证第一个的解决方法
Dec 24 Javascript
js中的 || 与 &amp;&amp; 运算符详解
May 24 Javascript
优雅的在React项目中使用Redux的方法
Nov 10 Javascript
Vue项目中Api的组织和返回数据处理的操作
Nov 04 Javascript
Vue通过WebSocket建立长连接的实现代码
Nov 05 Javascript
vue实现div可拖动位置也可改变盒子大小的原理
Sep 16 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防止注入攻击实例分析
2014/11/03 PHP
windows平台中配置nginx+php环境
2015/12/06 PHP
PHP对象、模式与实践之高级特性分析
2016/12/08 PHP
JavaScript之appendChild、insertBefore和insertAfter使用说明
2010/12/30 Javascript
js中事件的处理与浏览器对象示例介绍
2013/11/29 Javascript
nodejs读取memcache示例分享
2014/01/02 NodeJs
javascript中expression的用法整理
2014/05/13 Javascript
微信小程序入门教程
2016/11/18 Javascript
JS实现点击链接切换显示隐藏内容的方法
2017/10/19 Javascript
监听angularJs列表数据是否渲染完毕的方法示例
2018/11/07 Javascript
jQuery ajax仿Google自动提示SearchSuggess功能示例
2019/03/28 jQuery
nodejs语言实现验证码生成功能的示例代码
2019/10/13 NodeJs
JS实现时间校验的代码
2020/05/25 Javascript
在Echarts图中给坐标轴加一个标识线markLine
2020/07/20 Javascript
python数据清洗系列之字符串处理详解
2017/02/12 Python
python 将字符串转换成字典dict的各种方式总结
2018/03/23 Python
基于python的多进程共享变量正确打开方式
2018/04/28 Python
python3的输入方式及多组输入方法
2018/10/17 Python
python引入不同文件夹下的自定义模块方法
2018/10/27 Python
Python面向对象基础入门之设置对象属性
2018/12/11 Python
Python多线程获取返回值代码实例
2020/02/17 Python
python GUI库图形界面开发之PyQt5信号与槽机制、自定义信号基础介绍
2020/02/25 Python
Django使用Profile扩展User模块方式
2020/05/14 Python
巴西在线鞋店:Shoestock
2017/10/28 全球购物
在求职信中如何凸显个人优势
2013/10/30 职场文书
四年级数学教学反思
2014/02/02 职场文书
活动总结报告怎么写
2014/07/03 职场文书
生产操作工岗位职责
2014/09/16 职场文书
2015年妇联工作总结范文
2015/04/22 职场文书
大学生敬老院活动总结
2015/05/07 职场文书
刑事申诉状范文
2015/05/20 职场文书
致青春观后感
2015/06/09 职场文书
独生子女证明范本
2015/06/19 职场文书
小学大队长竞选稿
2015/11/20 职场文书
《自然之道》读后感3篇
2019/12/17 职场文书
python自动获取微信公众号最新文章的实现代码
2022/07/15 Python