网站搜索

javascript - 如何使用 jQuery 避免按键延迟?


目标:

当用户在文本框中输入字符时,让一个按钮出现。当用户使用退格键清空文本框但按住该键几秒钟时,立即隐藏按钮。

问题:

如果用户输入了一个字符,然后使用退格键将其删除——通过按住退格键几秒钟——按钮被隐藏之前会有延迟。这种情况只会在用户只输入了一个字符然后按住退格键不放时发生。如果用户输入了多个字符,然后按住退格键直到文本框为空,隐藏按钮时就不会有延迟。

<input type="text" id="tbox"></text>
<button type="button" id="btn"  style="display:none;">push me</button>

$('#tbox').on('keydown keypress keyup',function(){
    if($('#tbox').val() !== '') {
        $('#btn').css({'display':'block'});
    } else {
        $('#btn').css({'display':'none'});
    }
});

JSFIDDLE :

http://jsfiddle.net/odkut0dh/

答案#1

对情况做一个小小的讲解:

假设 <input> 的值是 "x",并且你按下退格键:
- 当 keydown 事件触发时,输入框的值仍然是 "x"。
- 当 keypress 事件触发时,值仍然是 "x"。
如果你 不 松开按键:
__ keydown 会再次触发,经过一段延迟后,根据操作系统可能不同,值现在是 ""。
__ keypress 会再次触发,值仍然是 ""。
__ 当你松开按键时,keyup 触发,值是 ""。
如果你 松开 按键:
__ keypress 会直接触发,值是 ""。

对于 IE10 及以上版本的解决方案是使用 input 事件,当 textEditable 元素的内容发生变化时会触发,或者如 @Mayhem 所建议的 change 事件,该事件甚至不会监听键盘输入,并且比 input 具有更好的浏览器支持

$('#tbox').on('input change',function(e){
    if($('#tbox').val() !== '') {
        $('#btn').css({'display':'block'});
    } else {
        $('#btn').css({'display':'none'});
    }
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<input type="text" id="tbox"></text>
<button type="button" id="btn"  style="display:none;">push me</button>

答案#2

由于我已经对这个做过评论,我快速谷歌了一下,发现了这篇文章,可能会让事情更容易一些……使用 JQuery 检测对 的所有更改(立即)

所以我把它放到这里的一个小工具里给你测试:轻微修改版

HTML

<input type="text" value="Some Value" id="text1" />
<button id="btn1">Click Me</button>

JS

 $('#text1').each(function() {
   var elem = $(this);
   elem.data('oldVal', elem.val());
   elem.bind("propertychange change click keyup input paste", function(event){
      if (elem.data('oldVal') != elem.val()) {
          if (elem.val().length == 0 ) {
              $("#btn1").hide();
          } else {
              $("#btn1").show();
          }
       elem.data('oldVal', elem.val());
     }
   });
 });

由于我没有太多时间把这段代码拆分成部分……乍一看……你不需要 elem.data……只需要绑定事件……啊,看起来我决定为你简化代码……

http://jsfiddle.net/z2ew3fqz/3/ 使用相同的HTML...

我能根据上面给出的例子做的最短版本

HTML

<input type="text" value="Some Value" id="text1" />
<button id="btn1">Click Me</button>

JS

 $('#text1').bind("propertychange change click keyup input paste", function(event){
     if ($(this).val().length == 0 ) {
         $("#btn1").hide();
     } else {
         $("#btn1").show();
     }
 });

我已经在 Chrome 上快速测试过了……鼠标/功能键似乎都能正常影响它……其他浏览器我就留给原帖者自己测试了……如果在某个特定浏览器有问题,请告诉我……

IE10 似乎是对此的最低支持……IE9 可能可以完成一个 JS 原型.. 但是在你的项目中,为支持 IE<10,这有多重要?