2011-01-19 2 views
0

Это странно, но у меня есть код автозаполнения, который я настроил, чтобы заниматься только при вводе знака «@» ... В FireFox он отлично работает. Я набираю один «@», и появляется раскрывающийся список.Проблема с Chrome и jQuery

НО ... когда я пытаюсь использовать его в Chrome, для включения выпадающего меню требуется два «@@».

Что это может быть?

Вот код в распределительном заявление, которое активирует автозаполнения раскрывающегося списка:

  case KEY.ATSIGN: 
      clearTimeout(timeout); 
      timeout = setTimeout(onChange, options.delay); 
      //alert("hi"); 
      //select.show(); 
      break; 
     default: 

      break; 

Другое странное поведение является то, что, когда в объявлении предупреждения Постулаты, он на самом деле работает, когда я набираю один «@» в Chrome .. . Есть какие нибудь идеи как это починить? Благодаря!

EDIT

Вот функция OnChange, где я заменить знак @ с пустой «», чтобы он не показать или представить @ когда элемент выбран из выпадающего списка

function onChange(crap, skipPrevCheck) { 
    if(lastKeyPressCode == KEY.DEL) { 
     select.hide(); 
     return; 
    } 

    var currentValue = $input.val(); 

    if (!skipPrevCheck && currentValue == previousValue) 
     return; 

    previousValue = currentValue; 

    currentValue = lastWord(currentValue); 
    if (currentValue.length >= options.minChars) { 
     $input.addClass(options.loadingClass); 
     if (!options.matchCase) 
      currentValue = currentValue.toLowerCase(); 
      currentValue = currentValue.replace("@",""); 
      request(currentValue, receiveData, hideResultsNow); 
      //alert(currentValue); 
    } else { 
     stopLoading(); 
     select.hide(); 
    } 
}; 

NEW EDIT Вы можете увидеть на знаке значение ASCII устанавливается здесь 50

var KEY = { 
    UP: 38, 
    DOWN: 40, 
    DEL: 46, 
    TAB: 9, 
    RETURN: 13, 
    ESC: 27, 
    COMMA: 188, 
    PAGEUP: 33, 
    PAGEDOWN: 34, 
    BACKSPACE: 8, 
    ATSIGN: 50 
}; 

Затем в операторе переключателя, автозаполнения активируется только тогда, когда знак @ нажата:

 switch(event.keyCode) { 

     case KEY.UP: 
      event.preventDefault(); 
      if (select.visible()) { 
       select.prev(); 
      } else { 
       onChange(0, true); 
      } 
      break; 

     case KEY.DOWN: 
      event.preventDefault(); 
      if (select.visible()) { 
       select.next(); 
      } else { 
       onChange(0, true); 
      } 
      break; 

     case KEY.PAGEUP: 
      event.preventDefault(); 
      if (select.visible()) { 
       select.pageUp(); 
      } else { 
       onChange(0, true); 
      } 
      break; 

     case KEY.PAGEDOWN: 
      event.preventDefault(); 
      if (select.visible()) { 
       select.pageDown(); 
      } else { 
       onChange(0, true); 
      } 
      break; 

     // matches also semicolon 
     case options.multiple && $.trim(options.multipleSeparator) == "," && KEY.COMMA: 
     case KEY.TAB: 
     case KEY.RETURN: 
      if(selectCurrent()) { 
       // stop default to prevent a form submit, Opera needs special handling 
       event.preventDefault(); 
       blockSubmit = true; 
       return false; 
      } 
      break; 

     case KEY.ESC: 
      select.hide(); 
      break; 
     case KEY.ATSIGN: 
      clearTimeout(timeout); 
      timeout = setTimeout(onChange, options.delay); 
      //alert("hi"); 
      //select.show(); 
      break; 
     default: 

      break; 
    } 

А вот функция OnChange, которая вызывается в случае заявления после того, как @ нажата

function onChange(crap, skipPrevCheck) { 
    if(lastKeyPressCode == KEY.DEL) { 
     select.hide(); 
     return; 
    } 

    var currentValue = $input.val(); 

    if (!skipPrevCheck && currentValue == previousValue) 
     return; 

    previousValue = currentValue; 
    //alert(previousValue); 
    currentValue = lastWord(currentValue); 
    if (currentValue.length >= options.minChars) { 
     $input.addClass(options.loadingClass); 
     if (!options.matchCase) 
      currentValue = currentValue.toLowerCase(); 
      currentValue = currentValue.replace("@",""); 
      //alert(currentValue); 
      request(currentValue, receiveData, hideResultsNow); 

    } else { 
     stopLoading(); 
     select.hide(); 
    } 
}; 

Как я уже говорил, это прекрасно работает в FF ... Я нажмите @ один раз и автозаполнения активирует ... Однако в Chrome, я должен нажать @@ (в знак дважды) ....

Также здесь немного кода непосредственно перед переключателем заявления

// only opera doesn't trigger keydown multiple times while pressed, others don't work with keypress at all 
$input.bind(($.browser.opera ? "keypress" : "keydown") + ".autocomplete", function(event) { 
    // a keypress means the input has focus 
    // avoids issue where input had focus before the autocomplete was applied 
    hasFocus = 1; 
    // track last key pressed 
    lastKeyPressCode = event.keyCode; 
+0

К какому событию это «активатор» в сочетании? OnKeyUp? – Gidon

+0

Я думаю, вы только что показали нам 2 части кода, которые не имеют отношения к проблеме. :) – galambalazs

+0

Активатор - это когда вы нажимаете знак @ ... Ascii 50. –

ответ

0

Посмотрите на 3-й комментарий к вопросу.

jQuery Event Keypress: Which key was pressed?

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

Вы также можете импровизировать быстрый пример на что-то вроде http://jsbin.com/

+0

Ну, я вижу, вы опубликовали дубликат этого вопроса, а затем отметили, что нашли ответ - вы должны были сделать то же самое для этого вопроса - или попросил закрыть его ... – calumbrodie

Смежные вопросы