【问题标题】:Can I query/detect the double click speed for a webpage user?我可以查询/检测网页用户的双击速度吗?
【发布时间】:2012-01-10 03:36:44
【问题描述】:

它取决于操作系统/用户。不是浏览器,不是网站,而是操作系统决定双击的快慢。

我想在我的应用中使用该号码。有没有办法用 JS 得到那个数字?

简单的问题。可能是不可能的。

谢谢

【问题讨论】:

    标签: javascript html double-click


    【解决方案1】:

    我想在我的应用中使用该号码。有没有办法用 JS 得到那个数字?

    绝对不是——像这样的东西超出了 JavaScript 的范围。

    您可以通过要求用户双击来找出适用于双击的值,监听 click 事件并查看 dblclick event 是否被触发 - 我不确定是否事件不过,处理方式就是这样。但即使这样可行,距离真正找出实际价值还有很长的路要走。

    【讨论】:

    • 它并不完全在 JS 范围之外...浏览器使用该值来触发 dblclick 事件。我想也许它会让我分享知识。显然不是。谢谢。
    【解决方案2】:

    简单的回答:不,抱歉。

    您可以做的最好的事情就是这样(示例使用 jQuery 只是因为它编写起来更快,如果 jQuery 不可用,原则仍然存在。另请注意,这可以很好地简化,这正是首先想到的):

    var timer,
        num = 0;
    $("#example").click(function() {
        /*This condition is required because 2 click events are fired for each
        dblclick but we only want to record the time of the first click*/
        if(num % 2 === 0) {
            timer = (new Date()).getTime();
        }
        num++;
    }).dblclick(function() {
        var time2 = (new Date()).getTime(),
            dblClickTime = time2 - timer; 
    });
    

    不幸的是,这可能不是很有帮助。您可能能够记录 dblClickTime 值并检查最长的值,但这仍然不太可能是您所追求的实际值。这类事情是无法通过 JavaScript 实现的。

    【讨论】:

    • 确实不是很有帮助 =) 但我仍然会尝试,只是为了尝试。顺便说一句,您可以像+new Date 那样更快更短地执行(new Date()).getTime()。它位于jsperf 上的某个地方
    • === 也是不必要的 =) 但它就像一个魅力。 jsfiddle.net/rudiedirkx/Wtt58/show 这几乎很有趣。我的 dblclick 时间 => 322 毫秒。 编辑哎呀,现在我们到了某个地方:464 毫秒。
    • 同意=== 是不必要的,但这只是习惯。个人认为这是一种很好的做法。 +new Date 的好把戏,我喜欢这样。你说得对,就像游戏一样,我得到了 532ms!不过只有一次……从那以后没有超过大约 460 毫秒。
    【解决方案3】:

    这是我 2015 年的解决方案,希望看到一个纯 js 版本。

    var start;
    var click = null;
    
    $(document).click(function() {
        var now = performance.now();
        start = click ? click : now;
        click = now;
    
    }).dblclick(function() {
        alert(performance.now()-start)
    });
    

    编辑

    纯 JS

    var start;
    var click = null;
    
    var getStart = function() {
        var now = performance.now();
        start = click ? click : now;
        click = now;
    }
    var getStop = function() {
        alert(performance.now()-start)
    }
    
    
    if (window.addEventListener) {
        window.addEventListener('click', getStart , false);
    } else {
        window.attachEvent('onclick', function() {
            return(getStart.call(window, window.event));   
        });
    }
    if (window.addEventListener) {
        window.addEventListener('dblclick', getStop , false);
    } else {
        window.attachEvent('ondblclick', function() {
            return(getStop.call(window, window.event));   
        });
    }
    

    【讨论】:

      【解决方案4】:

      补充 James Allardice 的回答:

      根据您的实现以及您正在寻找双击的位置,您可能还需要检查用户的鼠标位置(或者我猜是点击位置)。这是为了避免在用户单击页面不同部分上的内容时双击触发(再次取决于您的事件侦听器实现 - 例如,如果它只是在一个按钮上,这可能不是问题)。

      当点击事件触发时,下面我的示例中的事件侦听器有两个变量e.clientXe.clientY。这将为您提供鼠标的位置。您可能需要检查用户自第一次单击后是否明显移动了鼠标(根据您的代码进行相应调整)。

      document.addEventListener("click", function(e){ console.log("Mouse X: " + e.clientX + ": Mouse Y: " + e.clientY); });
      

      您不希望它太紧,否则用户可能永远无法触发双击,并且您不希望它太松以致用户似乎随机触发双击。可能从第一次单击周围的 25 像素左右的框开始(这再次取决于您的应用程序)。您可以根据自己的用户界面进行测试和调整。

      我假设你没有 jQuery 或者没有使用它,因为我相信 jQuery 可能已经做了这个计算来触发 dblclick

      【讨论】:

        【解决方案5】:

        答案 2021 - 据我所知 - 仍然没有。有一个原因:我们不应该在意。

        原则上dblclick 在某种程度上已经过时了……

        我们有不知名的detail 属性。也许是因为名字。

        来自 MDN:

        传递给单击事件处理程序的 MouseEvent 对象将其详细属性设置为目标被单击的次数。换句话说,详细信息将是 2 表示双击,3 表示三次单击,依此类推。该计数器在没有任何点击的情况下会在很短的时间间隔后重置;该间隔多长时间的具体细节可能因浏览器和平台而异。间隔也很可能受到用户偏好的影响;例如,可访问性选项可能会延长此间隔,以便更轻松地使用自适应界面执行多次点击。

        detail 即。 click_count 可以在 detail != 1 时停止 CLICK 的传播

        所以是伪代码:

        if evt.detail==1
            do_click()
        if evt.detail==2
            do_dblclick()
        ...
            
        if evt.detail!=1
            evt.stopPropagation()   
            
        

        如果有人真的需要区分点击、双击、三次点击……就像“异或”一样,他们真的应该重新考虑设计。

        DblClickTime 可能会很长,这意味着如果用户只想点击操作,应用感觉就像没有响应。

        另一个问题是,用户的意图可能是双击,但速度很慢 - 然后有两个点击动作,它们不应该与 dblclick 不同。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-11-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-01-12
          • 1970-01-01
          相关资源
          最近更新 更多