2013-07-31 3 views
4

Я использую bootstrap typeahead.keyup не работает на Chrome на Android

Это зависит от этого JQuery кода для работы:

el.on('keyup', doSomething()) 

В Chrome на Windows, она отлично работает. В Chrome на Android этого нет. Событие keyup никогда не запускается. Элемент, к которому он привязан, определенно имеет фокус.

Это, по-видимому, недавняя разработка.

Chrome 28.0.1500.64 Android 4.1.2 SGP321 Сложение/10.1.1.A.1.307

Благодаря

--Justin Уилли

ответ

1

К сожалению сказать это, но KeyUp/KeyDown события делают не работает для браузера Chrome в Android. Есть другие люди, которые сообщили об этом выпуске (Here и Here) за последние 1 год, и его еще не зафиксировано. поэтому разработчикам лучше избегать использования этих событий, пока они не будут исправлены.

+0

Bizarrely достаточно, я обнаружил, что если вы положили в пространстве (32) коды ключа, а затем в забой (8) группа клавиш, если срабатывает KeyUp для забоя. Но только с предыдущим пространством! –

+0

есть объяснение, почему ключевые события сложно получить в android chrome https://code.google.com/p/chromium/issues/detail?id=132015 –

+0

Я прочитал некоторые комментарии на 118639. У меня есть отключил автозаполнение, хотя я не понимаю, почему это невозможно. Так или иначе, я вижу проблемы в целом. Но что делать? Должен ли я писать функцию setInterval и отслеживать изменения текста? Кстати, похоже, он работает с любым алфавитно-цифровым символом, за которым следует обратное пространство, а не просто пробел. –

3

Сегодня я столкнулся с этой проблемой. Как андроид хром не поддерживает эти ключевые события! Я предполагаю, что вы нашли обходной путь к настоящему времени, но вот исправление, к которому я пришел сейчас.

function newKeyUpDown(originalFunction, eventType) { 
    return function() { 
     if ("ontouchstart" in document.documentElement) { // if it's a touch device, or test here specifically for android chrome 
      var $element = $(this), $input = null; 
      if (/input/i.test($element.prop('tagName'))) 
       $input = $element; 
      else if ($('input', $element).size() > 0) 
       $input = $($('input', $element).get(0)); 

      if ($input) { 
       var currentVal = $input.val(), checkInterval = null; 
       $input.focus(function(e) { 
        clearInterval(checkInterval); 
        checkInterval = setInterval(function() { 
         if ($input.val() != currentVal) { 
          var event = jQuery.Event(eventType); 
          currentVal = $input.val(); 
          event.which = event.keyCode = (currentVal && currentVal.length > 0) ? currentVal.charCodeAt(currentVal.length - 1) : ''; 
          $input.trigger(event); 
         } 
        }, 30); 
       }); 
       $input.blur(function() { 
        clearInterval(checkInterval); 
       }); 
      } 
     } 
     return originalFunction.apply(this, arguments); 
    } 
} 
$.fn.keyup = newKeyUpDown($.fn.keyup, 'keyup'); 
$.fn.keydown = newKeyUpDown($.fn.keydown, 'keydown'); 
Смежные вопросы