2024-08-28 05:00:04

事件

显然,一个被禁用的<input>没有被任何事件处理

有没有办法解决这个问题?

<input type="text" disabled="disabled" name="test" value="test" />
$(':input').click(function () {
    $(this).removeAttr('disabled');
})

在这里,我需要单击输入来启用它。但是如果我不激活它,输入就不会被发布。


当前回答

在某些浏览器中,禁用的元素“吃掉”点击——它们既不响应这些点击,也不允许事件处理程序在元素或其容器的任何位置捕获它们。

恕我直言,最简单、最干净的“修复”这个问题的方法(如果你确实需要像OP那样捕捉禁用元素的点击)就是向你的页面添加以下CSS:

input[disabled] {pointer-events:none}

这将使对禁用输入的任何单击都传递到父元素,在父元素中您可以正常捕获它们。(如果您有几个禁用的输入,您可能希望将每个输入放入单独的容器中,如果它们还没有这样布局的话—例如,一个额外的<span>或<div>—只是为了便于区分单击了哪个禁用的输入)。


不幸的是,这个技巧不适用于不支持指针事件CSS属性的旧浏览器。(它应该工作在IE 11, FF v3.6, Chrome v4): caniuse.com/#search=pointer-events

如果您需要支持旧的浏览器,则需要使用其他答案之一!

其他回答

或者用jQuery和CSS做这个!

$('input.disabled').attr('ignore','true').css({
    'pointer-events':'none',
     'color': 'gray'
});

这样你可以让元素看起来是禁用的,没有指针事件会被触发,但它允许传播,如果提交,你可以使用属性'ignore'来忽略它。

在某些浏览器中,禁用的元素“吃掉”点击——它们既不响应这些点击,也不允许事件处理程序在元素或其容器的任何位置捕获它们。

恕我直言,最简单、最干净的“修复”这个问题的方法(如果你确实需要像OP那样捕捉禁用元素的点击)就是向你的页面添加以下CSS:

input[disabled] {pointer-events:none}

这将使对禁用输入的任何单击都传递到父元素,在父元素中您可以正常捕获它们。(如果您有几个禁用的输入,您可能希望将每个输入放入单独的容器中,如果它们还没有这样布局的话—例如,一个额外的<span>或<div>—只是为了便于区分单击了哪个禁用的输入)。


不幸的是,这个技巧不适用于不支持指针事件CSS属性的旧浏览器。(它应该工作在IE 11, FF v3.6, Chrome v4): caniuse.com/#search=pointer-events

如果您需要支持旧的浏览器,则需要使用其他答案之一!

我找到了另一个解决方案:

<input type="text" class="disabled" name="test" value="test" />

类"disabled"通过不透明度模仿禁用元素:

<style type="text/css">
    input.disabled {
        opacity: 0.5;
    }
</style>

如果元素被禁用,则取消事件并删除类:

$(document).on('click','input.disabled',function(event) {
    event.preventDefault();
    $(this).removeClass('disabled');
});

禁用元素不会触发鼠标事件。大多数浏览器会将源自被禁用元素的事件传播到DOM树中,因此事件处理程序可以放置在容器元素上。然而,Firefox并没有表现出这种行为,当您单击禁用元素时,它只是什么都不做。

我想不出更好的解决方案,但是,为了实现完全的跨浏览器兼容性,您可以在禁用的输入前放置一个元素,并捕获对该元素的单击。下面是我想说的一个例子:

<div style="display:inline-block; position:relative;">
  <input type="text" disabled />
  <div style="position:absolute; left:0; right:0; top:0; bottom:0;"></div>
</div>​

jq:

$("div > div").click(function (evt) {
    $(this).hide().prev("input[disabled]").prop("disabled", false).focus();
});​

示例:http://jsfiddle.net/RXqAm/170/(更新为使用jQuery 1.7的prop而不是attr)。

这里的建议看起来也很适合回答这个问题

在禁用元素上执行单击事件?Javascript jQuery

jQuery('input#submit').click(function(e) {
    if ( something ) {        
        return false;
    } 
});