输入禁用事件


234

显然<input>,任何事件都不会处理残疾人

有没有解决此问题的方法?

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

在这里,我需要单击输入以启用它。但是,如果我不激活它,则不应发布输入。



您可以使用CSS-pretend-disable并遍历onSubmit处理程序中的输入,从而禁用未激活的输入。
ptrk

Answers:


267

禁用的元素不会触发鼠标事件。大多数浏览器会将事件从禁用元素传播到DOM树,因此事件处理程序可以放在容器元素上。但是,Firefox不会表现出这种行为,当您单击禁用的元素时,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)。


2
小事情:如果您使用的disabled属性没有值,则表示HTML而不是XHTML,在这种情况下,不需要使用斜杠。
Tim Down'6

11
@Tim:确实是不必要的,但它仍然是有效的HTML。这实际上只是一种习惯,我觉得它看起来更好。
安迪E 2010年

1
Thx Andy,这很聪明。有没有更简单的方法?您知道为什么无效输入无法处理吗?
Pierre de LESPINAY,2010年

2
这没有道理:任何其他html元素都处理鼠标事件,为什么不处理禁用的元素(例如mouseenter,等等)
Augustin Riedinger

7
您可以通过放入input[disabled] {pointer-events:none}CSS 来阻止禁用的元素“放弃”点击。然后,单击的行为就像您单击父元素一样。恕我直言,这是最简单,最干净的解决方案,但不幸的是,它仅适用于支持pointer-eventsCSS属性的浏览器: caniuse.com/#search=pointer-events
Doin

70

也许您可以将字段设置为只读,并在提交时禁用所有只读字段

$(".myform").submit(function(e) {
    $("input[readonly]", this).attr("disabled", true);
});

输入(+脚本)应为

<input type="text" readonly="readonly" name="test" value="test" />

$('input[readonly]').click(function () {
    $(this).removeAttr('readonly');
})

5
+1,这是一个不错的替代建议。唯一的缺点是输入框不会采用禁用的样式,这在浏览器之间会有所不同,因此很难使其看起来与用户对禁用输入的期望保持一致。
Andy E 2010年

真正。也许可以使用CSS解决此问题?但是,是的,它的外观不会与正常的
禁用

优秀的替代解决方案。我更喜欢这种样式,因为您可以使用CSS进行任何必要的样式设置(即,使其禁用“ LOOK”),但仍然具有可用的事件。
约书亚

62

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

恕我直言,“修复”此问题的最简单,最干净的方法(如果您确实需要像OP那样捕获对禁用元素的点击),只是在页面中添加以下CSS:

input[disabled] {pointer-events:none}

这将使对禁用输入的任何点击都落入父元素,您可以在其中正常捕获它们。(如果您有几个禁用的输入,则可能需要将每个输入放置在自己的单独容器中,如果它们尚未采用这种方式布置-一个额外的<span>或一个<div>-例如,只是为了轻松区分哪个禁用的输入被点击)。


不利的一面是,该技巧很遗憾不适用于不支持pointer-eventsCSS属性的旧版浏览器。(它应可从IE 11,FF v3.6,Chrome v4运行):caniuse.com/#search=pointer-events

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


我不确定是否input[disabled]还会匹配被JavaScript(element.disabled = true;)禁用的元素,但似乎确实如此。无论如何,我发现input:disabled更清洁。
马丁

这似乎是一个很好的解决方案,但是在IE11中对我不起作用!您也说FF 38+和Chrome 31+,但是您的canause链接说FF 3.6+和Chrome 4+?
user764754 '17

@ user764754 ...我的错误,我没有意识到我需要单击caniuse页面上的“ Show All”以获取较早的浏览器版本!已经解决了。至于IE11,我刚刚对其进行了测试,并且工作正常(有关代码,请参见jsfiddle.net/7kkszq1c/1,尽管出于某些原因jsFiddle网站在IE11中对我不起作用,我不得不将其粘贴到。而不是htm文件)
Doin

感谢更新!同时,我还观察到它可以在IE11中的网站上运行,但不能与jsfiddle一起使用。也许是因为jsfiddle iframe ...
user764754 '02

2
@Protectorone:disabled是自CSS 3开始的伪类:w3.org/TR/css3-selectors/#UIstates
Martin

15

我建议一种替代方法-使用CSS:

input.disabled {
    user-select : none;
    -moz-user-select : none;
    -webkit-user-select : none;
    color: gray;
    cursor: pointer;
}

而不是Disabled属性。然后,您可以添加自己的CSS属性以模拟禁用的输入,但具有更多控制权。


4
仅与ie10一起使用,太多的用户拥有ie9 /8。因此不是一个可靠的选择。
编码

这仍然导致字段在提交表单时被过帐,这在许多情况下是不希望的。
cimmanon 2015年

7

$(function() {

  $("input:disabled").closest("div").click(function() {
    $(this).find("input:disabled").attr("disabled", false).focus();
  });

});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script>

<div>
  <input type="text" disabled />
</div>


5
但这在FireFox上不起作用-这就是重点!
GarethOwen

6

相反disabled,您可以考虑使用readonly。使用一些额外的CSS,您可以设置输入的样式,使其看起来像disabled字段。

实际上还有另一个问题。change仅当元素失去焦点时才触发该事件,这不是考虑disabled字段的逻辑。可能您是从另一个呼叫将数据推送到该字段中。为此,您可以使用事件“ bind”。

$('form').bind('change', 'input', function () {
    console.log('Do your thing.');
});

的只读输入仍将与形式,如果我没有记错提交
皮埃尔·德·LESPINAY

没错 然后应将其与@npth anwsner结合使用。
Nykac

谢谢,这很干净,对我的情况很乐观。
Sultanos

4

或者用jQuery和CSS做到这一点!

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

通过这种方式,您可以使元素看起来处于禁用状态,并且不会触发任何指针事件,但是它允许传播,如果提交,则可以使用属性“ ignore”来忽略它。


@Precastic,是的,但是目前几乎所有其他浏览器都可以使用,您可以对<11使用polyfill。sidonaldson,为什么不使用直接CSS来应用样式?
KyleMit 2014年

@KyleMit您可以添加一个类而不是设置样式,但这不是该线程的目的!我只是建议指针事件,根据您要构建的浏览器矩阵,这仍然是一个正确的正确答案。感谢所有将此答案标记为下来的人,因为这里没有错误是不对的:/
sidonaldson

1
@sidonaldson,这是一个很好的答案,所以我也希望它也能排名更高。我不确定ignore属性的作用。但是我对CSS的观点是,我认为我们不需要jQuery成为应用CSS的工具。您可以只设置针对相同选择器的CSS规则,并禁用指针事件。 在这种摆弄中,jQuery和CSS应该做同样的事情,但是CSS的性能要高得多。
KyleMit 2014年

@KyleMit啊,假设表单已提交,您必须以某种方式告诉后端如果该字段包含一个值,则忽略该字段(因为我们欺骗已禁用)。
sidonaldson 2014年

我同意CSS可能会更强大,因为您可以使用基于属性的选择器!在我与chromes
sidonaldson 2014年

0

今天我们遇到了这样的问题,但是我们不想更改HTML。所以我们使用mouseenter事件来实现

var doThingsOnClick = function() {
    // your click function here
};

$(document).on({
    'mouseenter': function () {
        $(this).removeAttr('disabled').bind('click', doThingsOnClick);
    },
    'mouseleave': function () {
        $(this).unbind('click', doThingsOnClick).attr('disabled', 'disabled');
    },
}, 'input.disabled');

-1

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

<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');
});

JavaScript部分不适用于我。除此之外,它不能回答问题,因为它与启用禁用的输入有关。但是,在此示例中,它在一开始并未被禁用,因此在提交时被发送。
RaimundKrämer15年

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.