显然,一个禁用的 <input>
并不会被任何事件处理。
是否有一种方法可以解决这个问题?
<input type="text" disabled="disabled" name="test" value="test" />
$(':input').click(function () {
$(this).removeAttr('disabled');
})
这里,我需要点击输入框以启用它。但如果我没有激活它,那么该输入框不应该被提交。
显然,一个禁用的 <input>
并不会被任何事件处理。
是否有一种方法可以解决这个问题?
<input type="text" disabled="disabled" name="test" value="test" />
$(':input').click(function () {
$(this).removeAttr('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
)。
disabled
属性且没有赋值,那意味着您正在使用 HTML 而不是 XHTML,此时结束斜杠是不必要的。 - Tim Downmouseenter
等)? - Augustin Riedingerinput[disabled] {pointer-events:none}
可以防止禁用的元素将你的点击“扔掉”。然后,点击的行为就像你点击了父元素一样。在我看来,这是最简单、最干净的解决方案,但不幸的是,它只适用于支持pointer-events
CSS属性的浏览器:http://caniuse.com/#search=pointer-events - Doininput::before { bottom: 0; content: ''; left: 0; position: absolute; right: 0; top: 0; }
- Christophe Geers在某些浏览器中,禁用的元素会“吞噬”点击事件 - 它们既不响应它们,也不允许它们被任何元素或其容器上的事件处理程序捕获。
在我看来,“修复”这个问题(如果确实需要捕获禁用元素上的点击事件)的最简单、最清晰的方法就是将以下CSS添加到您的页面中:
input[disabled] {pointer-events:none}
这将使禁用输入框上的任何点击事件穿透到父元素,您可以在那里正常捕获它们。如果您有多个禁用的输入框,如果它们没有以这种方式布局,您可能需要将每个输入框放入自己的单独容器中,例如额外的<span>
或<div>
,以便轻松区分哪个禁用的输入框被点击了。
不幸的是,这个技巧在不支持pointer-events
CSS属性的旧浏览器中不起作用。 (它应该从IE 11、FF v3.6、Chrome v4开始运行):caniuse.com/#search=pointer-events
如果您需要支持旧浏览器,您将需要使用其他答案之一!
input[disabled]
是否也会匹配通过 JavaScript (element.disabled = true;
) 禁用的元素,但它似乎确实如此。无论如何,我认为 input:disabled
更加简洁。 - Martininput:disabled
是Jquery选择器,不能在CSS中使用,而input[disabled]
可以。 - Protector one也许你可以将该字段设置为只读,在提交时禁用所有只读字段。
$(".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;
}
可以使用 readonly
属性代替 disabled
属性。然后,您可以添加自己的 CSS 属性来模拟禁用输入框,但具有更多控制权。
与其使用disabled
,您可以考虑使用readonly
。通过一些额外的CSS,您可以将输入框样式设置为看起来像一个disabled
字段。
实际上还有另一个问题。事件change
只有在元素失去焦点时才触发,这对于disabled
字段来说是不合逻辑的。可能您正在从另一个调用中向该字段推送数据。要使此功能正常工作,您可以使用事件“bind”。
$('form').bind('change', 'input', function () {
console.log('Do your thing.');
});
$(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>
$('input.disabled').attr('ignore','true').css({
'pointer-events':'none',
'color': 'gray'
});
你完全可以使用 CSS 和 readonly
的组合来模拟 disabled
属性,没有任何理由不这样做:
Faux-Disabled: <input type="text" value="1" readonly="1" style="background-color:#F6F6F6;"><br>
Real-Disabled: <input type="text" disabled="true" value="1"></input>
注意:这不会像在<form>
中使用disabled
那样有常规行为,它可以防止服务器看到该字段。这只是为了在您想要禁用服务器端无关紧要的字段时使用。
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');
我做了与Andy E非常相似的事情; 除此之外,我使用了一个周围的<a>标签。然而,我需要“名称”,所以我将其更改为没有“href”的<a>标签。
readonly
而不是disabled
。我知道这不是OP所要求的,但可能有人和我处于同样的情况... - Hache_raw