事件在禁用input

显然一个禁用的<input>不会被任何事件处理

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

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

在这里,我需要点击input来启用它。 但是,如果我不激活它,input不应该被张贴。

禁用的元素不会触发鼠标事件。 大多数浏览器都会将一个事件从被禁用的元素传播到DOM树上,所以事件处理程序可以放在容器元素上。 然而,Firefox不会出现这种行为,当你点击一个禁用的元素时,它什么也不做。

我想不出一个更好的解决scheme,但是,为了实现完整的跨浏览器兼容性,您可以在禁用的input前放置一个元素,并捕获该元素的点击。 这里是我的意思的一个例子:

 <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 )。

也许你可以使字段只读,并提交禁用所有只读字段

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

和input(+脚本)应该是

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

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

恕我直言,最简单,最清洁的方式来“解决”这个(如果你确实需要捕获点击禁用的元素像OP一样)只是添加下面的CSS到你的页面:

 input[disabled] {pointer-events:none} 

这将使任何对禁用input的点击落在父元素上,在那里你可以正常捕获它们。 (如果你有几个禁用的input,你可能想要把它们放在一个单独的容器中,如果它们还没有按照这种方式布置的话 – 只需要一个额外的<span><div>就可以了 -容易区分哪个被禁止的input被点击)。


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

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

我会build议一个替代 – 使用CSS:

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

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

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

或者用jQuery和CSS做这个!

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

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

而不是disabled ,你可以考虑使用readonly 。 有了一些额外的CSS,您可以设置input的样式,使其看起来像disabled字段。

实际上还有另一个问题。 事件change只会在元素失去焦点时触发,而不是考虑disabled字段的逻辑。 也许你正在从另一个电话向这个领域推送数据。 为了使这个工作,你可以使用事件“绑定”。

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

我find另一个解决scheme

 <input type="text" class="disabled" name="test" value="test" /> 

类“禁用”通过不透明模仿禁用的元素:

 <style type="text/css"> input.disabled { opacity: 0.5; } </style> 

然后取消事件,如果元素被禁用,并删除类:

 $(document).on('click','input.disabled',function(event) { event.preventDefault(); $(this).removeClass('disabled'); }); 

这里的build议看起来也是这个问题的一个很好的候选人

在禁用的元素上执行点击事件? JavaScript的jQuery

 jQuery('input#submit').click(function(e) { if ( something ) { return false; } });