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