什么是跨浏览器方式捕获按钮上的所有单击?

时间:2010-04-05 04:54:22

标签: javascript jquery internet-explorer javascript-events cross-browser

无论点击速度和浏览器如何,每次点击按钮时,完全执行一次功能的最佳方法是什么?

简单地绑定“click”处理程序在除IE之外的所有浏览器中都能正常工作。

在IE中,当用户点击太快时,只会触发“dblclick”,因此永远不会执行“click”处理程序。其他浏览器触发这两个事件,因此对他们来说不是问题。

明显的解决方案/ hack(至少对我来说)是在IE中附加一个dblclick处理程序,它会触发我的点击处理程序两次。另一个想法是使用mousedown / mouseup跟踪自己的点击次数,这看起来很原始,可能属于框架而不是我的应用程序。

那么,处理这个问题的最佳/通常/正确方法是什么? (纯javascript或jQuery首选)

2 个答案:

答案 0 :(得分:1)

根据您的情况,您可以使用不同的方法,但我建议使用带有jQuery的命名空间事件处理程序,如下所示:

function eventHandler(event) {
    // your handler code here
    doSomeMagic();
}

var element = $('#element');

element.one('click.someNameSpace', function(event){
    // first we unbind all other event handlers with this namespace
    element.unbind('.someNameSpace');

    // then we execute our eventHandler
    eventHandler();
}).one('dblclick.someNameSpace',  function(event){
    // If this fires first, we also unbind all event handlers
    element.unbind('.someNameSpace');

    // and then execute our eventHandler
    eventHandler();
});

我不确定这会按你想要的方式运作,但我认为这是一个开始。

答案 1 :(得分:1)

Mousedown和mouseup就像点击功能一样,不幸的是当IE因为双击而省略了点击时它也会省略mousedown和mouseup。在任何情况下,您都可以将click和dblclick添加到同一个对象,并通过一个函数提供点击,该函数可以解决任何过于接近上一次的点击。

<div onclick="clk()" ondblclick="clk()"></div>

lastclicktime=0
function clk(){
    var time=new Date().getTime()
    if(time>lastclicktime+50){
        lastclicktime=time
        //Handle click
    }
}

我顺便发现,至少在Firefox中,dblclick事件没有给出事件时间,因此我必须解析为Date方法。