禁止通过';滚动Ajax.Autocompleter建议列表&';和';)';

禁止通过';滚动Ajax.Autocompleter建议列表&';和';)';,autocomplete,Autocomplete,我使用的是Ajax.Autocompleter组件,除了某些浏览器中的符号之外,它工作得非常好。问题在于,它不是将符号和符号打印到搜索字段中,而是充当ajax建议列表中的“向上”箭头。这使得我的用户无法在搜索框中输入带有符号的姓名 具体行为案例: 如果我在显示带有建议的列表之前尝试在搜索字段中键入符号and,则符号and将添加到搜索字段中,一切正常 如果我在建议列表已经可见后尝试键入符号and,它将导航到列表的末尾,并且不会向搜索字段(Chrome)添加任何内容 如果我在IE11中重复这个场

我使用的是Ajax.Autocompleter组件,除了某些浏览器中的符号之外,它工作得非常好。问题在于,它不是将符号和符号打印到搜索字段中,而是充当ajax建议列表中的“向上”箭头。这使得我的用户无法在搜索框中输入带有符号的姓名

具体行为案例:

  • 如果我在显示带有建议的列表之前尝试在搜索字段中键入符号and,则符号and将添加到搜索字段中,一切正常

  • 如果我在建议列表已经可见后尝试键入符号and,它将导航到列表的末尾,并且不会向搜索字段(Chrome)添加任何内容

  • 如果我在IE11中重复这个场景,它也会导航到列表的末尾,但也会将符号和添加到搜索字段中。但是,在这种情况下不会触发ajax搜索-建议列表将保持在我按下“&”键之前的状态,而不管搜索字段是否以&结尾

  • Firefox只是将“&”字符添加到搜索框中,并刷新自动完成建议列表。正如我所料

通过反复试验,我注意到:

  • 当我在chrome中打开F12并调试javascript时,会打印符号,而不是浏览建议列表。当调试关闭时,它不会打印任何内容,而是进行导航
  • 如果我使用ctrl+v将符号粘贴到搜索字段中,它在所有浏览器中都可以正常工作。另一方面,左alt+38执行上述操作,与普通键相同
我的代码:

<input name="searchTxt" id="searchTxt" type="text" autocomplete="off" />
<div id="autocompleteResults" style="display:none;border:1px solid black;background-color:white;text-align:left;"></div>

<script type="text/javascript" language="javascript" charset="utf-8">
  new Ajax.Autocompleter('searchTxt','autocompleteResults','someUrlToGetAutocompleteResults', {});
</script>

新的Ajax.Autocompleter('searchTxt','autocompleteResults','someurltotgetautocompleteresults',{});
到目前为止,我能找到的唯一线索都很薄弱:

  • 有人在chrome和youtube搜索中遇到了类似的符号问题
  • 另一个关于Ajax.Autocompleter的StackOverflow线程,但与此完全无关

非常感谢您的帮助-我将更详细地学习Ajax.Autocompleter项目,但由于这似乎与浏览器相关,我希望有人至少能给出部分答案。

经过更多的调试,我发现了导致此问题的原因。scriptaculous库由几个.js文件组成-第一个问题出现在文件“controls.js”第129行

这是一个处理一些按键的函数,例如上下箭头在建议列表中导航。在chrome中,在按下“&”和“(”键而不是箭头后调用此函数,从而导致问题

  onKeyPress: function(event) {
    if(this.active)
      switch(event.keyCode) {
       case Event.KEY_TAB:
       case Event.KEY_RETURN:
         this.selectEntry();
         Event.stop(event);
       case Event.KEY_ESC:
         this.hide();
         this.active = false;
         Event.stop(event);
         return;
       case Event.KEY_LEFT:
       case Event.KEY_RIGHT:
         return;
       case Event.KEY_UP:
         this.markPrevious();
         this.render();
         Event.stop(event);
         return;
       case Event.KEY_DOWN:
         this.markNext();
         this.render();
         Event.stop(event);
         return;
      }
     else
       if(event.keyCode==Event.KEY_TAB || event.keyCode==Event.KEY_RETURN ||
         (Prototype.Browser.WebKit > 0 && event.keyCode == 0)) return;

    this.changed = true;
    this.hasFocus = true;

    if(this.observer) clearTimeout(this.observer);
      this.observer =
        setTimeout(this.onObserverEvent.bind(this), this.options.frequency*1000);
  }
虽然这仍然不是根本原因,但它肯定是可以使用的,至少可以用于解决方法(如果chrome然后忽略此函数中的箭头键,等等)

找到了罪魁祸首

事实证明,chrome和IE11(可能还有更多)浏览器在“onKeyPress”功能中的向上箭头和“&”键都具有相同的键码值。要了解更多信息,请参阅。一些人建议使用“keyDown”事件而不是“keyPress”,我采用了一种变通方法

我已经更改了文件“controls.js”第129行中的onKeyPress函数代码。解决方法不是100%——但它使ampersand通过shift+7工作,同时在firefox中保留了箭头键功能

  onKeyPress: function(event) {

    //Added this workaround
    var is_shift;
    if (window.event) {
        is_shift = window.event.shiftKey ? true : false;
    } else {
        is_shift = event.shiftKey ? true : false;
    }

    if(this.active)
      ...
       case Event.KEY_UP:
         if (!is_shift) //Added this workaround
         {
             this.markPrevious();
             this.render();
             Event.stop(event);
             return;
         }
       case Event.KEY_DOWN:
         if (!isShift) //Added this workaround
         {
             this.markNext();
             this.render();
             Event.stop(event);
             return;
         }
      }
    ...
  }
轮班解决方案的想法来自,而获取轮班状态的代码来自