【问题标题】:Button element not firing click event when clicking on button text and releasing off it (but still inside the button)?单击按钮文本并释放它(但仍在按钮内)时,按钮元素未触发单击事件?
【发布时间】:2013-03-28 10:47:35
【问题描述】:

在 WebKit 浏览器上(我在 Mac 上的 Chrome 和 Safari 上测试过),按钮元素的行为很奇怪:

文在这个小提琴http://jsfiddle.net/5ReUn/3/你做以下事情:

  1. 当光标在 HTML 按钮文本上时按鼠标左键
  2. 将光标(按下时)移动到按钮上没有文字的区域
  3. 松开鼠标键

那么按钮元素上的点击事件就不会触发了!

HTML 非常简单:

<button id="button">Click</button>

而且 CSS 一点也不复杂:

button {
    display: block;
    padding: 20px;
}

点击捕获的JS:

button = document.getElementById('button');
button.addEventListener('click', function() {
    console.log('click');
});

我网站的许多访问者抱怨按钮不可点击。他们没有意识到点击时正在移动光标。

有人找到解决方法了吗?

【问题讨论】:

  • 您的点击处理程序在哪里?我这里没有看到任何js
  • @silentboy,刚刚用 JavaScript 块更新了我的问题。单击并释放文本部分以及单击并释放按钮的非文本区域时会捕获单击。但是穿越是不行的。
  • 活动mousedown会做吗?请检查是否有人已回答。
  • @silentboy 正如我对该回复的评论,这不是按钮元素的良好用户体验。
  • 按钮够大吗?也许您可以对布局/设计做一些事情来解决问题。如果您更改按钮的正常行为,其他用户可能会感到困惑。

标签: javascript css webkit dom-events


【解决方案1】:

原来是a bug in WebKit。

一种快速的非 JavaScript 解决方案是将文本包装在 SPAN 元素中并使其点击:

<button>
    <span>Click Me</span>
</button>

示例 CSS:

span {
    display: block;
    padding: 20px;
    pointer-events: none;   // < --- Solution!
}

由于该bug只出现在WebKit中,所以不支持pointer-events的浏览器可以忽略。

【讨论】:

    【解决方案2】:

    如果您没有找到其他解决方案,您可以使用mousedown 事件而不是click 事件。

    这不是最佳解决方案,因为它的行为与正常情况不同。通常,当手指从鼠标按钮上松开时,用户期望该动作发生。不是当手指按住鼠标按钮时。

    【讨论】:

    • mousedown 不会是一个好的用户体验。按钮对mouseup 做出反应。除此之外,这意味着在一个相当大的网站上更改每个按钮上的事件。
    • @ErnestsKarlsons click 事件意味着在同一元素上发生mousedown 和mouseup 事件。那你想要什么?
    • 实际上,我将click 事件更改为mouseup 事件,并且它可以工作:/但我仍然想要一个更优雅的解决方案,它不涉及更改整个站点中的 JS 功能。
    【解决方案3】:

    您在此处尝试拖动而不是单击它。因此,您可能想尝试mousedown 事件。

    //This is same as click event
    var down = false;
    var button = document.getElementById('button');
    var info = document.getElementById('info')
    button.addEventListener('mousedown', function() {
        down = true;  
    });
    
    
    button.addEventListener('mouseup', function() {
        if(down){
            info.innerHTML += "click ";
            down = false;
        }
    });
    

    jsfiddle

    【讨论】:

    • 在同一元素内拖动通常不被视为拖动。
    • @ErnestsKarlsons 检查我更新的帖子。我希望这是你想要的.. 但是点击是一样的吗?
    • 对于一个简单的问题,这看起来像是一个极其复杂的解决方案。想象一个 Web 应用程序,您必须为每个按钮执行此操作!我开始认为这是 WebKit 中的一个错误。
    • @ErnestsKarlsons 检查我更新的小提琴并发布。在声明变量时还要保留var 作为前缀。这将有助于创建跨浏览器代码。
    • 感谢您继续编写代码。但是这种解决方案确实不适用于任何大小合适的网络应用程序。
    【解决方案4】:

    您可以在按钮周围添加一个 div(例如,20px 的边距?),并绑定相同的 js/jquery。这样,如果他们会missclick(lol),脚本仍然会触发。但是,我注意到,如果您在按下按钮时将鼠标拖离按钮,则该按钮不会执行任何操作(不仅仅发生在您的页面上,即使用 Facebook 登录按钮甚至本网站上的按钮尝试) .

    【讨论】:

    • 本网站上的按钮不使用按钮 HTML 标签。这对我来说很重要,因为我想在按钮标签内添加其他 HTML 元素(例如,图标等)。此外,我不会谈论在按钮外释放光标的情况。这只是在按钮文本之外释放光标,但仍在按钮内部。我猜,DIV 元素在这里无济于事。
    猜你喜欢
    • 2019-07-05
    • 2021-03-02
    • 2012-03-14
    • 1970-01-01
    • 2011-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-21
    相关资源
    最近更新 更多