javascript按键功能:不区分大小写的a-z,数字和一些特殊的字符?

时间:2011-01-02 08:26:49

标签: jquery regex ajax

$('.s').keyup(function(e) {

    if (!/[A-Za-z0-9]/.test(String.fromCharCode(e.which))) {
        return false;
    }

我想知道什么是我的应用程序的最佳正则表达式解决方案。 我有一个基于ajax的搜索,它应该只在按下实际字符时触发搜索,如a-Z(大写和小写),数字,也可能是问号,短划线(连字符)和感叹号。还应启用空格键。

否则,如果按下shift-,option或control-key,也会触发ajax搜索。

这里最简单的正则表达式模式是什么? 谢谢你的帮助

1 个答案:

答案 0 :(得分:2)

你的正则表达式的基本形式似乎很好,只包括你想要包含的内容,并注意重音字符。或者,您可以排除不想想要的字符。

但我会使用keypress事件而不是keyup事件。键入实际可键入字符时会触发keypress,并在键重复时触发(而即使键重复,您只会获得一个keyup)。 Shift,Meta,Ctrl等不会触发 keypress 更新:这不一定是真正的跨浏览器(叹气),请参阅下面的更新。

如果您正在挂钩keypress,我可能不会过滤掉任何内容(不需要正则表达式),因为我宁愿按照浏览器及其对语言环境的认识来解决问题一个真正的角色。我也可能包括一个短暂的延迟,以避免大量不必要的搜索。如果这个人相当快速地输入“fred”,就不需要搜索“f”,“fr”和“fre”。

这是我的意思的一个例子(将keypress与稍微延迟相结合)。如果你真的想要过滤掉某些字符,你可以在事件处理程序中执行此操作,但由于上述原因我没有:

HTML:

<input type='text' id='theText'>

JavaScript(使用jQuery,因为您使用jquery标记了您的问题):

jQuery(function($) {
  var searchTimer = 0;

  $('#theText').keypress(function() {
    if (searchTimer != 0) {
      clearTimeout(searchTimer);
    }
    searchTimer = setTimeout(doSearch, 250);
  });

  function doSearch() {
    searchTimer = 0;
    display("Search: '" + $('#theText').val() + "'");
  }

  function display(msg) {
    $('<p/>').html(msg).appendTo(document.body);
  }
});​

Live copy

该示例在它看到的最后一个keypress之后搜索四分之一秒;根据需要将参数调整为setTimeout


更新:在您下面关于箭头键的评论之后,我想“但您在keypress上看不到箭头键,是吗?”答案是:你在Opera和其他几个人身上做过。 叹气是的,有了过滤器:

$('#theText').keypress(function(event) {
  // Magic numbers from http://unixpapa.com/js/key.html
  switch (event.keyCode) {
    case 37: // Left
    case 38: // Up
    case 39: // Right
    case 40: // Down
      break;

    default:
      // A "real" key, include it
      if (searchTimer != 0) {
        clearTimeout(searchTimer);
      }
      searchTimer = setTimeout(doSearch, 250);
  }
});

function doSearch() {
  searchTimer = 0;
  display("Search: '" + $('#theText').val() + "'");
}

Live copy (这个只是过滤掉了箭头键;你想要扩展它)

如果你还不知道它,this page非常适合关于跨浏览器的键盘事件的疯狂信息。它可能有点过时了。