迷失网络

如果你误读成“迷失公园”或“迷失侏罗纪”,那你可能真的迷失网络了。
随笔 - 88, 评论 - 1932, 引用 - 106

导航

关于

lostinet@lostinet.com这个油箱不能用了。因为空间没了,lostinet.com指向为127.0.0.1 。。。

每月存档

最新留言

广告

 
在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 下的实现:

下面给出一个简单的代码.. 有兴趣的可以补充

打印 | 张贴于 2005-02-27 04:51:00

留言反馈

#回复: 解决 FireFox 下[使用event很麻烦] 的问题. 编辑
我在实现Drag时,在FF中基于mousedown触发,但event提示没有初始化。一般怎么定义event呢>
2007-12-02 17:39:00 | [匿名用户:韩国饰品批发]
#回复: 解决 FireFox 下[使用event很麻烦] 的问题. 编辑
感谢!
2007-04-26 13:56:00 | [匿名用户:Even]
#回复: 解决 FireFox 下[使用event很麻烦] 的问题. 编辑
感谢!
2007-04-26 13:56:00 | [匿名用户:Even]
#回复: 解决 FireFox 下[使用event很麻烦] 的问题. 编辑
能否发一封到我邮箱?谢谢
2006-12-27 14:08:00 | [匿名用户:我考百试通]
#re: 解决 FireFox 下[使用event很麻烦] 的问题. 编辑
在FireFox中用了这段代码后,如果再用AtlasTooKit中的CollapsiblePanel控件,CollapsiblePanel控件就会失效,有无解决的方法?

不知是哪个事件引起的冲突?

2006-08-11 18:49:00 | [匿名用户:ylhyh]
#re: 解决 FireFox 下[使用event很麻烦] 的问题. 编辑
window.constructor.prototype.__defineGetter__("event", function(){
var o = arguments.callee.caller;
var e;
while(o != null){
e = o.arguments[0];
if(e && (e.constructor == Event || e.constructor == MouseEvent)) return e;
o = o.caller;
}
return null;
});
2006-05-19 13:07:00 | [匿名用户:我佛山人]
#re: 解决 FireFox 下[使用event很麻烦] 的问题. 编辑
我认为ff也就是w3c标准的event模型是正确的。event不应该是全局的。例如连续的mousemove事件,可能刚刚(50ms以前?)取得的window.event就变掉了,因此你还是需要把window.event存下来然后传来传去。又,事件应该不仅仅是UIEvent,DOM的event应该有许多并非UI的event,例如load。而window.event仅仅是UIEvent而已,而且是mouse,keyboard等混在一起的。
2006-03-29 21:47:00 | [匿名用户:hax]
#re: 解决 FireFox 下[使用event很麻烦] 的问题. 编辑
在Firefox1.5测试之后,发现捕捉鼠标事件需要这样

if(arg0.constructor==MouseEvent)
return arg0;
2006-02-21 13:50:00 | [匿名用户:迪亚]
#re: 解决 FireFox 下[使用event很麻烦] 的问题. 编辑
太好了,我也想知道toElement和fromElement在FF下如何实现
2005-06-15 11:19:00 | [匿名用户:a]
#re:解决 FireFox 下[使用event很麻烦] 的问题. 编辑
解决 FireFox 下[使用event很麻烦] 的问题.ooeess
2005-06-08 16:29:00 | [匿名用户:风淋室]
#re:解决 FireFox 下[使用event很麻烦] 的问题. 编辑
^_~,pretty good!csharpsseeoo
2005-05-13 16:13:00 | [匿名用户:福禄克示波器]
#re:解决 FireFox 下[使用event很麻烦] 的问题. 编辑
^_~,pretty good!18showsseeoo
2005-04-26 12:30:00 | [匿名用户:电控气阀]
#re:解决 FireFox 下[使用event很麻烦] 的问题. 编辑
^_^,Pretty Good!
2005-04-15 19:23:00 | [匿名用户:旋转粘度计]
#re:解决 FireFox 下[使用event很麻烦] 的问题. 编辑
^_^,Pretty Good!
2005-04-10 19:44:00 | [匿名用户:湿度测控仪]
#re: 解决 FireFox 下[使用event很麻烦] 的问题. 编辑
Firefox里面的event没有toElement和fromElement属性,可以怎么实现??
2005-03-07 12:38:00 | [匿名用户:djshow]
#解决 FireFox 下[使用event很麻烦] 的问题. 编辑
Ping Back来自:blog.csdn.net
2005-03-01 11:21:00 | [匿名用户:sugar88]
#re: 解决 FireFox 下[使用event很麻烦] 的问题. 编辑
使用 Event 来判断是比较保守的方法.
但也符合逻辑.
因为如果事件是跨窗口的,
那么arg0是其他窗口的,Event是本窗口的,那么arg0.constructor=vent也是false了。
刚好满足window.event应该返回null的行为.

当然也可以通过参看几个常用的属性来判断..
例如
if(typeof(arg0)=='object'&&arg0.type&&arg0.target&&arg0.preventDefault&&arg0.stopPropagation)
{
}
2005-02-28 14:05:00 | [匿名用户:Lostinet]
#re: 解决 FireFox 下[使用event很麻烦] 的问题. 编辑
学习,顺便请教一下:arg0.constructor==Event这里是否有很直接的办法获取"Event"?
2005-02-28 07:58:00 | [匿名用户:javafaq2004]
#re: 解决 FireFox 下[使用event很麻烦] 的问题. 编辑
好方法!
2005-02-27 19:34:00 | [匿名用户:dudu]
对不起,目前本随笔不允许发表新评论.

Powered by: Joycode.MVC引擎 0.5.1.8