【问题标题】:onblur event doesn't fire in Chrome when clicking on disabled button element - works in IE单击禁用的按钮元素时,onblur 事件不会在 Chrome 中触发 - 在 IE 中有效
【发布时间】:2013-12-31 16:06:10
【问题描述】:

我有一个禁用按钮,当输入元素中有文本时应该启用该按钮。启用/禁用按钮的代码在输入的onblur 事件中。我的 HTML 由带有 id="in"input、带有属性 disabled="disabled"button 和带有 id="sp"span 组成。

$(document).ready(function(){
    var count = 0;
    $("#in").bind("blur",function(){
        alert("blur");
        if($("#in").attr("value").length > 0){
            $("button")[0].disabled = false;   
        } else {
            $("button")[0].disabled = true;
        }        
    });

    $("#in").bind("focusout",function(){
        alert("focusout");
        if($("#in").attr("value").length > 0){
            $("button")[0].disabled = false;   
        } else {
            $("button")[0].disabled = true;
        }        
    });

    $("button").click(function(){
        count++;
        $("#sp").text(count);
    });
});

在 IE 9 中,如果我在输入元素中键入文本并单击禁用的按钮,输入的 onblur 将触发,按钮变为启用状态,并且我得到按钮的单击事件。 但是,在 Chrome 中,当我在输入元素中输入文本并单击禁用按钮时,什么都没有发生。

我忽略的按钮是否有某些属性?我试图让focusout 开火,但我得到了相同的结果。我也使用 Firefox 得到相同的结果。 Chrome 似乎比 IE 更严格地对待disabled 属性,但这会给我们的用户带来问题。当我在禁用按钮上单击输入元素时,如何触发 onblur(或一些等效的)事件?

【问题讨论】:

  • 我在答案中添加了一个示例。您可能想检查一下,看看它是否符合您的要求。

标签: javascript google-chrome


【解决方案1】:

在 Chrome 中,禁用的按钮会删除所有事件侦听器。单击、右键单击、选择启动等不适用于禁用的按钮。这意味着当您单击禁用按钮时,焦点不会离开输入。您可以通过class="disabled" 手动禁用该按钮,并添加一些样式使其看起来已禁用。下面是一个 CSS 示例,您可以使用它来使按钮看起来被禁用:

button.disabled,
button.disabled:hover,
button.disabled:active,
button.disabled:focus {
    color:gray;
    background:#EEE;
    border:1px solid #AAA;
    border-radius:3px;
    outline:none;
}

我制作了一个显示此 here 的 JSFiddle。另请注意,我现在更改了切换禁用类的代码,而不是禁用属性,并且我在您的按钮单击事件处理程序中放置了 if 语句,以便在按钮时不会触发已禁用。

【讨论】:

  • 为什么会这样?为什么 Chrome 会删除禁用按钮上的所有事件侦听器?这是没有意义的,因为应用preventDefault 和/或stopPropagation 相对容易。此外,Firefox 甚至 IE 都不会这样做,尽管在 IE 中这可能是一个疏忽。
  • @trysis 我必须说我不知道​​。我在网络标准上唯一能找到的是"A form control that is disabled must prevent any click events (...) from being dispatched on the element.",所以 Chrome 可能已经采用了该规范并将其应用于所有事件。将其应用于 click、mousedown、keydown 等才有意义,因此我可以理解他们是否也将其简单地应用于每个事件侦听器。
猜你喜欢
  • 2020-02-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-19
  • 2023-01-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多