禁用输入的事件

Pie*_*NAY 221 html javascript jquery

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

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

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

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

And*_*y E 249

禁用的元素不会触发鼠标事件.大多数浏览器会将源自禁用元素的事件传播到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>?
Run Code Online (Sandbox Code Playgroud)

JQ:

$("div > div").click(function (evt) {
    $(this).hide().prev("input[disabled]").prop("disabled", false).focus();
});?
Run Code Online (Sandbox Code Playgroud)

示例:http://jsfiddle.net/RXqAm/170/(更新为使用jQuery 1.7 prop代替 attr).

  • @Tim:确实没必要,但它仍然是有效的HTML.这只是一种习惯的力量,我觉得它看起来更好. (10认同)
  • 你可以通过在CSS中输入`input [disabled] {pointer-events:none}`来阻止被禁用的元素"丢弃"你的点击.然后,单击的行为就像您单击了父元素一样.恕我直言这是最简单,最干净的解决方案,但不幸的是它仅适用于支持`pointer-events` CSS属性的浏览器:http://caniuse.com/#search=pointer-events (4认同)
  • 小问题:如果你使用没有值的`disabled`属性,那意味着HTML而不是XHTML,在这种情况下,结束斜杠是不必要的. (2认同)
  • 这没有意义:任何其他html元素处理鼠标事件,为什么不处理禁用元素(例如``mouseenter`等) (2认同)

Tok*_*mon 65

也许你可以只读取字段并在提交时禁用所有只读字段

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

输入(+脚本)应该是

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

$('input[readonly]').click(function () {
    $(this).removeAttr('readonly');
})
Run Code Online (Sandbox Code Playgroud)

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

Doi*_*oin 54

禁用元素在某些浏览器中"吃掉"点击 - 它们既不响应它们,也不允许它们被元素或其任何容器上的任何地方的事件处理程序捕获.

恕我直言"最简单,最干净"的方法来"修复"这个(如果你确实需要捕获像OP这样的禁用元素的点击)只是将以下CSS添加到你的页面:

input[disabled] {pointer-events:none}
Run Code Online (Sandbox Code Playgroud)

这将使对禁用输入的任何点击都会降低到父元素,您可以在其中正常捕获它们.(如果你有几个禁用的输入,你可能想把它们放入一个单独的容器中,如果它们还没有这样布局 - 一个额外的<span>或者<div>说,比如说 - 只是为了便于区分哪个禁用的输入点击了).


缺点是遗憾的是,这个技巧不适用于不支持pointer-eventsCSS属性的旧浏览器.它应该适用于IE 11,FF v3.6,Chrome v4):caniuse.com/#search=pointer-events

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

  • @Protectorone:自CSS 3以来,disabled是一个伪类:https://www.w3.org/TR/css3-selectors/#UIstates (2认同)

Ron*_*ter 15

我建议一个替代方案 - 使用CSS:

input.disabled {
    user-select : none;
    -moz-user-select : none;
    -webkit-user-select : none;
    color: gray;
    cursor: pointer;
}
Run Code Online (Sandbox Code Playgroud)

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

  • 只适用于ie10,太多用户有ie9/8.所以不是一个可靠的选择. (4认同)

Rej*_*ath 7

$(function() {

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

});
Run Code Online (Sandbox Code Playgroud)
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script>

<div>
  <input type="text" disabled />
</div>
Run Code Online (Sandbox Code Playgroud)

  • 但这对FireFox不起作用 - 这就是重点! (5认同)

小智 7

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

其实还有一个问题。该事件change仅在元素失去焦点时触发,这不是考虑disabled字段的逻辑。可能您正在将数据从另一个调用推送到该字段。要完成这项工作,您可以使用事件“绑定”。

$('form').bind('change', 'input', function () {
    console.log('Do your thing.');
});
Run Code Online (Sandbox Code Playgroud)