2024-08-28 05:00:04

事件

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

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

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

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


当前回答

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

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

其他回答

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

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

input[disabled] {pointer-events:none}

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


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

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

您可以考虑使用readonly而不是disabled。使用一些额外的CSS,您可以对输入设置样式,使其看起来像一个禁用字段。

实际上还有另一个问题。事件更改仅在元素失去焦点时触发,考虑到禁用字段,这不是逻辑。可能您正在将数据从另一个调用推入该字段。要做到这一点,你可以使用事件'bind'。

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

没有理由不能使用CSS和readonly的组合来模拟disabled属性:

false - disabled: <input type="text" value="1" readonly="1" style="background-color:#F6F6F6;" > < br > Real-Disabled: <input type="text" disabled="true" value="1"></input>

注意:在<表单>中,它不会有常规的禁用行为,阻止服务器看到字段。这只是为了防止您想要禁用服务器端无关紧要的字段。

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

$(".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');
});

一个活生生的例子:

$(".myform").submit(function(e) { $("input[readonly]").prop("disabled", true); e.preventDefault(); }); $('.reset').click(function () { $("input[readonly]").prop("disabled", false); }) $('input[readonly]').click(function () { $(this).removeAttr('readonly'); }) input[readonly] { color: gray; border-color: currentColor; } <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script> <form class="myform"> <input readonly="readonly" value="test" /> <input readonly="readonly" value="test" /> <input readonly="readonly" value="test" /> <input readonly="readonly" value="test" /> <input readonly="readonly" value="test" /> <input readonly="readonly" value="test" /> <input readonly="readonly" value="test" /> <input readonly="readonly" value="test" /> <input readonly="readonly" value="test" /> <button>Submit</button> <button class="reset" type="button">Reset</button> </form>

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

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

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