Функция нажатия клавиш в javascript: регистр-независимый a-z, числа и несколько специальных символов? - PullRequest
2 голосов
/ 02 января 2011
$('.s').keyup(function(e) {

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

Интересно, что является лучшим решением для регулярных выражений для моего приложения.У меня есть поиск на основе ajax, который должен запускать поиск, когда реальные символы нажимаются, например, aZ (верхний и нижний регистр), цифры и, возможно, вопросительный знак, тире (дефис) и восклицательный знак.Также должен быть включен пробел.

В противном случае поиск ajax также будет запущен при нажатии клавиши shift, option или control.

Какой шаблон регулярного выражения проще всего понятьВот?спасибо за вашу помощь

1 Ответ

2 голосов
/ 02 января 2011

Базовая форма вашего регулярного выражения выглядит хорошо, просто включите то, что вы хотите включить, и будьте в курсе символов с акцентом.С другой стороны, вы можете исключить символы, которые не хотите.

Но я бы использовал для этого событие keypress, а не keyup.keypress срабатывает, когда набирается фактический набираемый символ, и срабатывает при повторении клавиши (тогда как вы получаете только один keyup, даже если клавиша повторяется).keypress не запускается для Shift, Meta, Ctrl и т. Д. Обновление : это не обязательно верно для кросс-браузера (вздох) , см.Обновление ниже.

Если вы перехватываете 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);
  }
});​

Живая копия

Этот пример ищет четверть секунды после последней 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() + "'");
}

Живая копия (это всего лишь отфильтровывает клавиши со стрелками; вы хотите расширитьthat)

Если вы еще не знаете, если это так, эта страница отлично подходит для информации о безумии, которое происходит с событиями клавиатуры в браузерах.Может быть немного устаревшим.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...