【问题标题】:Clicking a disabled input or button单击禁用的输入或按​​钮
【发布时间】:2013-04-19 16:25:58
【问题描述】:

是否可以单击禁用的按钮并向用户提供一些反馈?

HTML:

<input type="button" value="click" disabled>

和 JavaScript:

$('input').mousedown(function(event) {
    alert('CLICKED');
});

上面的代码对我不起作用;这也不是:

$('input').live('click', function () {
    alert('CLICKED');
});

【问题讨论】:

  • 我认为点击事件不会在禁用的控件上触发
  • 所有被禁用控件的事件都被移除
  • 那你为什么禁用它

标签: javascript jquery disabled-control


【解决方案1】:

无法捕获对禁用元素的点击。最好的办法是对元素上的特定 class 做出反应。

HTML 标记:

<input type="button" class="disabled" value="click" />

JavaScript 代码:

$('input').click(function (event) {
    if ($(this).hasClass('disabled')) {
        alert('CLICKED, BUT DISABLED!!');
    } else {
        alert('Not disabled. =)');
    }
});

然后您可以使用 CSS 样式来模拟禁用的外观:

.disabled
{
    background-color: #DDD;
    color: #999;
}

这是一个 jsFiddle 演示它的用途。

【讨论】:

    【解决方案2】:

    设置字段readonly 会有所帮助,因为点击事件将被触发。虽然要注意differences in behaviour

    <input type="button" value="click" readonly="readonly" />
    

    【讨论】:

      【解决方案3】:

      input[disabled] {pointer-events:none}
      

      在您的 CSS 中(它可以防止某些浏览器完全放弃对禁用输入的点击),并捕获对父元素的点击。恕我直言,这是一个更干净的解决方案,而不是在元素上放置透明覆盖以捕获点击,并且根据情况也可能比使用 CSS 简单地“模拟”禁用状态要容易得多(因为这不会阻止输入已提交,并且还需要覆盖默认浏览器的“禁用”样式)。

      如果您有多个这样的按钮,则需要为每个按钮设置一个唯一的父级,以便能够区分单击了哪个按钮,因为使用pointer-events:none,单击目标是按钮的父级而不是按钮本身. (或者你可以测试一下点击坐标,我想......)。

      如果您需要支持旧版浏览器,请检查哪些浏览器支持pointer-eventshttp://caniuse.com/#search=pointer-events

      【讨论】:

      • 在 FF 中为我工作 - 最简单和最兼容的答案
      • 这应该是被接受的答案,也适用于 chrome
      • 使用包裹在禁用按钮周围的 div
      【解决方案4】:

      您不能没有解决方法,请参阅:jQuery detect click on disabled submit button

      浏览器禁用禁用元素上的事件。

      已编辑以从链接添加上下文:

      提问者发现了这个线程,并解释了事件未注册的原因:http://www.webdeveloper.com/forum/showthread.php?t=186057

      Firefox,也许还有其他浏览器,禁用表单字段上的 DOM 事件 被禁用。从禁用的表单域开始的任何事件都是 完全取消并且不会向上传播 DOM 树。纠正我 如果我错了,但如果你点击禁用按钮,来源 事件是禁用按钮,点击事件完全 歼灭。浏览器根本不知道按钮被点击了, 它也不会传递点击事件。就好像你在点击一个 网页上的黑洞。

      解决方法是将按钮设置为“看起来”禁用,但实际上并非如此。

      【讨论】:

        【解决方案5】:

        disabled 元素不允许用户与其交互。

        所以:不,您不能将onclick 放在disabled 按钮上并期望它触发。

        【讨论】:

          【解决方案6】:

          &lt;input id="idButton" type="button" value="click" disabled&gt;

          $('#idButton').on('click', function() {
              // The button is disabled but this will be executed.
          });
          

          以上示例适用于需要捕获事件的禁用按钮的 JQuery。

          【讨论】:

          • 为什么你认为这行得通?是因为身份证吗?还是因为它是一个按钮?还是价值?这至少在文本输入上不起作用。
          • 老实说我不确定,但我怀疑这是 JQuery 在加载 DOM 时关联侦听器的顺序,或者它很可能只是在这样做时忽略了 disabled 属性。
          【解决方案7】:

          你不能点击禁用的按钮,但可以点击禁用的链接

          $('.btn').on('click', function(e) {
            e.preventDefault();
            $txt = $('div.text');
            if($(this).attr('disabled')){
              $txt.html('CLICKED, BUT DISABLED!!');
            }else{
              $txt.html('Not disabled. =)');
            }
          });
          <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
          <div class="text">No action</div>
          <input type="button" href="" class="btn" value="click" />
          <input type="button" href="" class="btn" value="click disabled" disabled />
          <a href="" class="btn">Click</a>
          <a href="" class="btn" disabled>Click Disabled</a>

          【讨论】:

            【解决方案8】:

            如果将按钮包装在某个元素中并捕获点击该元素的行为呢?

            <span id="container">
                <input type="button" value="click" disabled>
            </span>
            

            Javascript:

            $("#container").click(function(){
                alert("Element clicked!");
            })
            

            【讨论】:

            • 我喜欢你的回答,但不幸的是它不起作用。我猜disabled 阻止事件传播或其他东西
            【解决方案9】:

            您应该使用 disabled="disabled" 而不仅仅是 disabled。

            $('input:disabled').val('disabled');
            

            【讨论】:

            • 你不能点击任何带有 disabled="disabled" 的元素——这就是禁用它的关键。
            猜你喜欢
            • 2020-12-06
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多