禁用输入上的事件

IT技术 javascript jquery html
2021-02-01 05:31:40

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

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

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

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

6个回答

禁用的元素不会触发鼠标事件。大多数浏览器会将源自禁用元素的事件沿 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.7prop代替 attr)。

谢谢安迪,这很聪明。没有更简单的吗?你知道为什么不能处理禁用的输入吗?
2021-03-16 05:31:40
@Tim:确实没有必要,但它仍然是有效的 HTML。这真的只是一种习惯的力量,我觉得它看起来更好。
2021-03-25 05:31:40
这没有意义:任何其他 html 元素处理鼠标事件,为什么不禁用禁用元素(例如mouseenter,等)
2021-03-30 05:31:40
您可以通过放入input[disabled] {pointer-events:none}CSS来阻止禁用元素“丢弃”您的点击然后单击的行为就像您单击了父元素一样。恕我直言,这是最简单、最干净的解决方案,但不幸的是,它仅适用于支持pointer-eventsCSS 属性的浏览器caniuse.com/#search=pointer-events
2021-04-03 05:31:40
小事:如果您使用disabled没有值属性,则意味着使用 HTML 而不是 XHTML,在这种情况下,关闭斜杠是不必要的。
2021-04-05 05:31:40

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

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

input[disabled] {pointer-events:none}

这将使对禁用输入的任何点击落入父元素,在那里您可以正常捕获它们。(如果您有多个禁用的输入,您可能希望将每个放入一个单独的容器中,如果它们还没有以这种方式布置 - 一个额外的<span>或一个<div>,比如说 - 只是为了便于区分哪个禁用的输入被点击)。


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

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

@ user764754 ...我的错误,我没有意识到我需要在 caniuse 页面上单击“显示全部”才能获得早期浏览器版本!已经解决了。至于 IE11,我刚刚对其进行了测试,它运行良好(有关代码,请参阅jsfiddle.net/7kkszq1c/1,但由于某种原因,jsFiddle 站点在 IE11 中对我不起作用,我不得不将其粘贴到 . htm 文件代替)
2021-03-16 05:31:40
这似乎是一个很好的解决方案,但在 IE11 中对我不起作用!你还说 FF 38+ 和 Chrome 31+ 但你的 caniuse 链接说 FF 3.6+ 和 Chrome 4+?
2021-03-21 05:31:40
感谢更新!同时,我还观察到它在 IE11 中的网站上有效,但在 jsfiddle 中无效。也许是因为 jsfiddle iframe ......
2021-03-29 05:31:40
@Protectorone :disabled 是自 CSS 3 以来的伪类:w3.org/TR/css3-selectors/#UIstates
2021-03-29 05:31:40
我不确定是否input[disabled]也会匹配被 JavaScript ( element.disabled = true;)禁用的元素,但似乎确实如此。反正我觉得比较input:disabled干净。
2021-04-07 05:31:40

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

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

并且输入(+ 脚本)应该是

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

一个活生生的例子:

+1,这是一个不错的替代建议。唯一的缺点是输入框不会采用禁用样式,这在浏览器之间会有所不同,因此很难使其看起来与用户对禁用输入的期望一致。
2021-03-20 05:31:40
这正是我需要的!
2021-04-02 05:31:40
真的。也许这可以通过 CSS 解决?但是是的,它的外观与普通的禁用输入字段不同
2021-04-06 05:31:40
优秀的替代解决方案。我更喜欢这个,因为您可以使用 CSS 进行任何必要的样式设置(即禁用 LOOK),但仍然有可用的事件。
2021-04-06 05:31:40

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

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

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

只适用于 ie10,太多用户有 ie9 / 8。所以不是一个可靠的选择。
2021-03-12 05:31:40
这仍然会导致提交表单时该字段被发布,这在许多情况下是不可取的。
2021-03-30 05:31:40

$(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>

但这在 FireFox 上不起作用 - 这就是重点!
2021-03-22 05:31:40