这很奇怪,但我有一些自动完成代码,我只是在你输入“@”符号时自定义...在FireFox中它运行得很好。我键入一个'@',然后出现下拉列表。
但是......当我在Chrome中试用它时,它需要两个'@@'来进行下拉菜单。
这可能是什么?
以下是switch语句中激活自动完成下拉列表的代码:
case KEY.ATSIGN:
clearTimeout(timeout);
timeout = setTimeout(onChange, options.delay);
//alert("hi");
//select.show();
break;
default:
break;
另一个奇怪的行为是,在广告提醒时,它实际上可以在我在Chrome中键入一个'@'时有效...有关如何解决此问题的任何想法?谢谢!
修改
这是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();
}
};
新编辑 您可以看到at符号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语句中,只有在按下@符号时才会激活自动完成功能:
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;
}
这是在按下@后在case语句中调用的函数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中,我必须按@@(在符号两次)....
这里还有一些代码就在switch语句之前
// 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 :(得分:0)
查看问题的第3条评论。
jQuery Event Keypress: Which key was pressed?
你可能想尝试使用keyup而不是keypress,看看你能走多远。此外,如果您发布问题,最好删除所有不相关的代码,并将问题减少到最低限度。
您可能还想在http://jsbin.com/
之类的模拟快速示例