2013-03-11 48 views
1

我有一个文本输入字段和一个复选框。当且仅当在文本字段中输入时,该复选框必须被禁用。我有一个伟大工程大多数情况下的解决方案:通过鼠标操作更改浏览器文本输入时的响应

HTML:

<input type="text" id="search" /> 
<input type="checkbox" id="cb" /> 
<label for="cb">Enabled only if no search term</label> 

的jQuery:

$('#search').keyup(function (e) { 
    var enable = $(this).val() == 0; 
    if (enable) { 
     $('#cb').removeAttr('disabled'); 
    } else { 
     $('#cb').attr('disabled', 'disabled'); 
    } 
}); 

看到它live on jsFiddle

这适用于使用键盘输入或删除文本以及使用键盘粘贴文本的情况。

如果用户使用右键单击上下文菜单粘贴文本,或者用户按下IE添加到输入字段以允许清除输入字段的小“X”,则会失败。

问题

我怎样才能提高代码,以便它也能在这些情况?等待文本框失去焦点将提供较差的用户体验。

+0

你可以使用[这里]的Jquery Realtime验证插件(http://www.zurb.com/playground/jquery-text-change-custom-event) – 2013-03-11 20:16:29

+0

@Cthulhu:看起来非常酷。去尝试一下。 – 2013-03-11 20:27:26

+0

@Cthulhu:像魅力一样工作!如果你想把你的评论变成一个答案(这不仅仅是一个链接),我会很高兴接受它。 – 2013-03-11 20:47:09

回答

1

Real Time Validation jQuery插件来解决这个问题。但是,它具有委托事件not seem to work currently

实现此操作需要将事件绑定到keyup事件以及其他事件,如果要检测剪切和粘贴上的文本更改。即使你是一位JavaScript之神,一次又一次地写这个逻辑是很乏味的。做个聪明的人,改用ZURB文字变化事件插件。

0

您可以使用jQuery的改变方法:

http://jsfiddle.net/WDMCX/1/

$('#search').change(function() { 

    if($(this).val() === ''){ 
     $('#cb').attr('disabled', 'disabled'); 
    } else { 
     $('#cb').removeAttr('disabled'); 
    } 

}); 
+0

请解释downvotes。如果我错了,我想知道正确的方法,就像OP一样。 – Lowkase 2013-03-11 20:21:47

+0

我没有downvote,但*更改*将不会触发,直到文本输入字段失去焦点。由于焦点丢失可能会导致应该被禁用的复选框,因此不太理想的解决方案。不过,可能是唯一的解决方案。 – 2013-03-11 20:23:48

+0

啊,这很有道理,谢谢Eric J.的解释。 – Lowkase 2013-03-11 20:24:38