2012-12-27 85 views
3

我建立一个终端仿真运行了一个问题,与在Firefox中捕捉退格。我能够抓住第一个退格键并在提示符处移除输入中的最后一个字符,但它不会持续并移除多个字符。火狐的keydown退格键的问题

实际的网站:http://term.qt.io/

复制在这里:http://jsfiddle.net/BgtsE/1/

JavaScript代码

function handleKeys(e){ 
    var evt = e || window.event; 
    var key = evt.charCode || evt.keyCode; 
    if(evt.type == "keydown") 
    { 
     curr_key = key; 
     if(key == 8) 
     { 
      evt.preventDefault(); 
      if(0 < $('body').text().length) 
       $('body').text($('body').text().slice(0,-1)); 
     } 
    } 
    else if(evt.type == "keypress") 
    { 
     if(97 <= key && key <= 122) 
     { 
      if(curr_key != key) 
       $('body').append(String.fromCharCode(key)); 
     } 
     else 
      $('body').append(String.fromCharCode(key)); 
    } 
} 
$(function(){ 
    $('html').live({ 
     keydown:function(e){ 
      handleKeys(e); 
     }, 
     keypress:function(e){ 
      handleKeys(e); 
     } 
    }) 
})​ 
+0

仅供参考,'活()'被弃用的jQuery 1.7。你应该使用'bind()'或'on()'。 – Barmar

+0

你的小提琴适合我。 backspace自动重复可能取决于操作系统或浏览器。我正在使用OS X Snow Leopard和Chrome 24. – Barmar

+1

在Windows 17.0.1上使用Firefox时出现了一些问题。我将发布更详细的“答案”,但它看起来像某种错误 – HMR

回答

5

试试这个:http://jsfiddle.net/NBZG8/1/

你需要在这两个KeyDown和按键来处理退格支持Chrome和Firefox

function handleKeys(e){ 
    var evt = e || window.event; 
    var key = evt.charCode || evt.keyCode; 

    if (evt.type == "keydown") { 
     curr_key = key; 
     if(key == 8 && !$.browser.mozilla) { 
      backspaceHandler(evt); 
     } 
    } else if (evt.type == "keypress") { 
     if (key == 8) { 
      backspaceHandler(evt); 
     } else if (97 <= key && key <= 122) { 
      if(curr_key != key) { 
       $('body').append(String.fromCharCode(key)); 
      } 
     } else { 
      $('body').append(String.fromCharCode(key)); 
     } 
    } 
} 

function backspaceHandler(evt) { 
    evt.preventDefault(); 
    if(0 < $('body').text().length) { 
     $('body').text($('body').text().slice(0,-1)); 
    } 
}; 

$(function(){ 
    $('html').live({ 
     keydown : handleKeys, 
     keypress : handleKeys 
    }) 
})​ 
+0

爱它,谢谢。 –

+0

哇,真棒@snjoetw –

0

在Firefox窗口17.0.1由$返回的值(“选择”)。文本()有追加到末尾添加的新行字符。所以串并没有为我工作:

<html> 
    <head> 
     <title>test</title> 
     <script src="jquery.js"></script> 
     <script> 
      $("document").ready(function(){ 
       console.log("body text seems to have a new line character"); 
       console.log(($('body').text()[5]=="\n")); 
      }); 

      function handleKeys(e){ 
       var evt = e || window.event; 
       var key = evt.charCode || evt.keyCode; 
       if(evt.type == "keydown") 
       { 
        curr_key = key; 
        if(key == 8) 
        { 
         evt.preventDefault(); 
         if(0 < $('body').text().length) 
          // next line works, you might trim the \n if it's there at the end 
          //$('body').text($('body').text().slice(0,-2)); 
          // this one didn't work for me 
          $('body').text($('body').text().substring(0,$('body').text().length-1)); 
        } 
       } 
       else if(evt.type == "keypress") 
       { 
        if(97 <= key && key <= 122) 
        { 
         if(curr_key != key) 
          $('body').append(String.fromCharCode(key)); 
        } 
        else 
         $('body').append(String.fromCharCode(key)); 
       } 
      } 
      $(function(){ 
       $('html').live({ 
        keydown:function(e){ 
         handleKeys(e); 
        }, 
        keypress:function(e){ 
         handleKeys(e); 
        } 
       }) 
      }) 
     </script> 
    </head> 
    <body>12345</body> 
</html> 
0

我曾与Mozilla的按键同样的问题。 感谢这个主题,它解决了我的问题,所以我会发布我的代码,如果有人试图做我和我一样的事情。
在我为例我尝试自动空间,当用户键入两个数字,并没有工作在Firefox所以这是我的代码:

$(function() { 

    $('#field1, #field2').on('keypress',function(event) { 
     event = event || window.event; 
     var charCode = event.keyCode || event.which, 
      lgstring = $(this).val().length, 
      trimstring; 
     if(charCode === 8) { 
      event.returnValue = false; 
      if(event.preventDefault) 
       event.preventDefault(); 
      if(0 < $(this).val().length) { 
       $(this).val($(this).val().slice(0,-1)); 
      } 
     } 
     else if(((charCode > 31) && (charCode < 48 || charCode > 57)) || lgstring >= 14) { 
      event.returnValue = false; 
      if(event.preventDefault) 
       event.preventDefault(); 
     } 
     else { 
      trimstring = $(this).val().replace(/ /g,""); 
      if((lgstring !== 0) && (trimstring.length % 2) === 0) { 
       $(this).val($(this).val() + ' '); 
      } 
     } 
    }); 

}); 

我注意到,Mozilla的处理退格作为一个按键,其中Chrome不会。

对不起,我的英语我是法国人

0
$('#id').keypress(function(e) { 

if(e.charCode > 0 || e.keyCode === 8){ 
if(e.keyCode === 8){ 
    return true; 
}else if((e.charCode !== 0) && ((e.charCode > 57 && e.charCode < 65)){ 
    return false; 
    } 
}else if((e.keyCode !== 0) && ((e.keyCode > 57 && e.keyCode < 65)){ 
    return false; 
} 
});