【问题标题】:assign onclick event to function将 onclick 事件分配给函数
【发布时间】:2010-09-18 15:49:18
【问题描述】:

我想调用一个函数onclick并将事件对象传递给函数:

 progressBarOuter.onclick = function(e)  { 
     var x; if (!e) {
         x=window.event.clientX;
     } 
      else {
          x = e.clientX
     } 

     yt.clickedOffset = x; yt.progressBarClicked
 }

所以我通过封闭对象 (yt) 来分配 clickedOffset,然后调用 progressBarClicked,然后使用 clickedOffset 变量。但我实际上更愿意做的是这样的事情:

progressBarOuter.onclick = yt.progressBarClicked(e);

因为它更紧凑。问题是,即使用户点击或没有执行这段代码...... yt.progressBarClicked(e)。

有没有办法解决这个问题?

【问题讨论】:

    标签: javascript


    【解决方案1】:

    你的:

    progressBarOuter.onclick = yt.progressBarClicked(e);
    

    不会产生预期的结果,因为您没有将函数 yt.progressBarClicked 分配给 onclick 处理程序。您实际上是在调用该函数,因此将其返回值分配给 onclick

    在不破坏任何东西的情况下,你可以得到的最短的工作是这样的:

    progressBarOuter.onclick = function(e){
        yt.progressBarClicked((e || window.event).clientX); // pass the x position as a parameter
    };
    

    如果不包装它,yt.progressBarClicked 将从 window 对象中调用,因此函数内部的 this 的值也将设置为 window 对象。

    当然你也可以在函数内部处理 x 位置的计算,然后将事件传递给它:

    progressBarOuter.onclick = function(e){yt.progressBarClicked(e);};
    

    【讨论】:

    • 嗨,是的,我完全理解发生了什么,只是想知道是否有其他方法可以用来避免额外的匿名函数......但是这个 progressBarOuter.onclick = function(e){yt.进度条点击(e);};似乎是一个足够优雅的解决方案。谢谢!
    • 其实只是在做progressBarOuter.onclick = yt.progressBarClicked;够了...progressBarClicked 接收事件
    【解决方案2】:

    试试

    progressBarOuter.onclick = yt.progressBarClicked;
    

    但从技术上讲,这与您的原始代码不同。鼠标位置 (clientX) 的计算完全缺失。

    【讨论】:

    • 是的,这是我的问题。我想做你上面写的,但我需要传递事件......只是想可能有一种我不知道的方法来做到这一点
    • 该事件将自动传递给您的progressBarClicked 函数,因为它是鼠标事件的回调。
    • 这会破坏yt.progressBarClicked内部的this,因为该函数是从window对象调用的。
    • @Ivo - 是的,它会破坏this,但这只有在this首先在yt.progressBarClicked中使用时才有意义,但还是有好处。
    • 那么我如何访问progressBarClicked里面的事件属性呢?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-12-03
    • 2013-09-29
    • 1970-01-01
    • 2023-04-07
    • 2018-05-24
    • 2015-12-31
    • 1970-01-01
    相关资源
    最近更新 更多