obj.onmousedown = foo;foo(e)
{
  for(var i=0 ; i<arguments.length; i++)
  {
    alert(arguments[i]);
  }
}问题是:有没有办法给 foo传递其他参数,并且还能够获得 event对象e?注意:不能使用全局变量,只能通过参数传递,因为页面上有多个obj需要相应onmousedown事件,而全局变量只能有一个

解决方案 »

  1.   

    另:我能够实现给foo加其他参数,但是event对象e就丢失了
      

  2.   

    http://community.csdn.net/Expert/TopicView3.asp?id=5693553
      

  3.   

    Firefox中使用了不同的事件对象模型,不同于IE Dom,用的是W3C Dom.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<myalert.arguments.length;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>firefox 中赋予事件侦听的另类方法
      无意中发现这个,firefox 如果不是 inline 方式书写事件,得不到“当前”event(IE则可以),突然想到以属性的方式来添加事件,果然可以,不知道这算不算 W3C 的本意?以前必须在元素 inline 方式书写类似 onclick=getEvent() 这样的方式以参数传递的方式得到当前事件对象。但这样的代码与全部书写也好不了多少,也不能说是“干净”的代码。(注意下面代码中的注释)
      另外,第三个,为什么会在 alert 之后弹出下载管理器,奇怪。
    JS:
    <script>
    window.onload=ctrlEnter;
    function ctrlEnter(){
    //这句是对 IE 的,firefox 这样得不到当前事件对象
    //document.forms[0].bbb.onkeydown=function(){if(event.ctrlKey&&event.keyCode==13){document.forms[0].submit()}}
    //这句是对 firefox 的,IE不可以这样
    document.forms[0].bbb.setAttribute("onkeydown","if(event.ctrlKey&&event.keyCode==13){this.form.submit()}")
    }
    </script>
    <body>
    <div id="show">按ctrl+enter键提交</div>
    <form method="get">
    <input name="aaa" onkeydown="if(event.ctrlKey&&event.keyCode==13){this.form.submit()}" />
    <input name="bbb" />
    <input name="ccc" onkeydown="if(event.ctrlKey&&event.keyCode==13){alert(1)}" />
    </form>
    页面:
    <body>
    <input id="txtReply" />
    <script>
    document.getElementById("txtReply").onkeydown=Reply;
    function Reply(){
    alert(1)

    </script>
      

  4.   

    <input type=button value=test id=aaa>
    <SCRIPT srccccc="css/layout.js" type=text/javascript>//新层的定义
    document.getElementById("aaa").onmousedown = new Function("foo(event,this)");function foo(e)
    {
      for(var i=0 ; i<arguments.length; i++)
      {
        alert(arguments[i]);
      }
    }
    </SCRIPT>
      

  5.   

    for IE/FF-----
    <input type=button value=test2 onmousedown="foo(event,this);">
    <SCRIPT srccccc="css/layout.js" type=text/javascript>//新层的定义
    document.getElementById("aaa").onmousedown = function(event){foo(event||window.event,this)};function foo(e,obj)
    {
    alert(e);
    alert(obj.value)}
    </SCRIPT>
      

  6.   

    <input type=button value=test2 onmousedown="foo(event,this);">
    <SCRIPT srccccc="css/layout.js" type=text/javascript>//新层的定义
    document.getElementById("aaa").onmousedown = function(){foo(event||window.event,this)};----请教jk括号里面的event存在意义吗?感觉外层function不能传值吧?function foo(e,obj)
    {
    alert(e);
    alert(obj.value)}
    </SCRIPT>
      

  7.   

    请教jk括号里面的event存在意义吗?
    ----
    for firefox的.自已去掉试试看
      

  8.   

    http://blog.csdn.net/LxcJie/archive/2007/08/10/1736463.aspx
      

  9.   

    var evt=null,
    foot(e){
       evt=e
    }
      

  10.   

    答案是不能,呵呵~~通过在事件处理函数中使用this一般可以解决问题
      

  11.   

    obj.onmousedown = foo(e)
    {
      for(var i=0 ; i<arguments.length; i++)
      {
        alert(arguments[i]);
      }
    }
      

  12.   

    LS 写的什么呀Function("foo(event,this)");
      

  13.   

    其他参数不能通过Obj的属性来传么?
      

  14.   

    知道一个event还不够么?
    可以用:attachEvent||addEventListener传参数
    还可以: 给event.target||event.srcElement的属性赋值
    或者:给全局变量赋值
    或者:写cookie
    或者:写userdata
      

  15.   

    页面上有多个obj需要相应onmousedown事件,那应该这样处理1:给你的每个obj定义一个相同的类名,比如class=omdObj
    2:写一个htc文件,比如test.htc,内容如下
    <PUBLIC:ATTACH EVENT="onmousedown" ONEVENT="foo()" />
    <script>
    function foo(){
      alert(event.keyCode+".."+event.button+".."+element.id+".."+element.我的参数)
    }
    </script>
    3:在你的主页面的这样写
    <style>.omdObj{behavior:url(test.htc)}</style>
    <button class=omdObj id=1 我的参数="第一个">1111</button>
    <button class=omdObj id=2 我的参数="第二个">2222</button>
    <button class=omdObj id=3 我的参数="第三个">3333</button>
      

  16.   

    如果对caller不是很了解的话,用event.target||event.srcElement解决也可以,效率没有测算过,但是总归是种办法~~
      

  17.   

    Function.prototype.bind   =   function()  
    {   
          var   __method   =   this;   
          var   arg   =   arguments;   
          return   function() {   
              __method.apply(window,   arg);   
          }   
      }var str = "div onclick event";
    var div = document.createElement("div");
    div.onclick = div_onclick.bind(str); //将带参数的函数包装成无参数的函数function div_onclick(str)
    {
        alert(str);
    }
    详细介绍可以参加:javascript中如何将带参数函数包装成无参数函数 ,地址如下
    http://blog.csdn.net/FuWaer/archive/2007/09/09/1777931.aspx
      

  18.   

    if (Browser.moz)
    {
    var GetEvent = function()
    {
    var _f = GetEvent.caller; while (_f)
    {
    if (_f.arguments[0])
    {
    var _fac = _f.arguments[0].constructor; if (_fac==Event || _fac==MouseEvent || _fac==KeyboardEvent)
    {
    return _f.arguments[0];
    }
    } _f = _f.caller;
    } return null;
    }; window.constructor.prototype.__defineGetter__("event", function()
    {
    return GetEvent();
    });
    }
      

  19.   

    obj.onmousedown = function(){foo(event)}; foo(e)
    {
      for(var i=0 ; i<arguments.length; i++)
      {
    alert(arguments[i]);
      }
    }这样就可以了
      

  20.   

    学习!! ( 开源的基于ajax的可视化自定义web表单工具, 在: http://my5155.meibu.com )
      

  21.   

    前几天也遇到这样的问题,是这样解决的。以下来自网络。
    在各浏览器中动态添加事件-参数篇 
    动态添加事件有一难题便是参数,比如 obj.onclick = Foo(1); 这是不允许的。对于 FireFox 利用 setAttribute 比较方便,因为 setAttribute 指定事件跟 HTML 中指定事件形式一样。
    var obj = document.getElementById("obj");
    obj.setAttribute("onclick", "javascript:Foo(1);");而 IE 中不能用 setAttribute 添加事件,我们采用下面这种方法:
    var eventStr = this.objStr + ".ActivateItem(" + index + ");";
    this.items[index].titleID.attachEvent("onclick", function(){eval(eventStr)});