Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/400.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript HTML选择:消除按键更改时的浏览器延迟?_Javascript_Html_Dom_Html Select - Fatal编程技术网

Javascript HTML选择:消除按键更改时的浏览器延迟?

Javascript HTML选择:消除按键更改时的浏览器延迟?,javascript,html,dom,html-select,Javascript,Html,Dom,Html Select,考虑以下HTML: <select> <option>Aardvark</option> <option>Buffalo</option> <option>Camel</option> <option>X-ray Fish</option> <option>Yak</option> <option>Zebr

考虑以下HTML:

<select>
    <option>Aardvark</option>
    <option>Buffalo</option>
    <option>Camel</option>
    <option>X-ray Fish</option>
    <option>Yak</option>
    <option>Zebra</option>
</select>

土豚
水牛
骆驼
X射线鱼
牦牛
斑马
在大多数浏览器中,当select元素具有焦点时,按下一个键会将选定值更改为以键入的字符开始的下一个选项。例如,当上面的
元素具有焦点时,按键盘上的“B”将所选值更改为“Buffalo”。然后按“Z”将值更改为“Zebra”

但我刚刚发现,至少在我个人电脑上的Firefox 6和Safari 5中,在按下选择下一个值之前有一个延迟。在上面的具体示例中,如果我在不到一秒钟的时间内按下“B”,然后按下“Z”,则似乎什么也没有发生

然而,在进一步的测试(使用jQuery)中,我发现Javascript事件“keydown”、“keyup”和“keypress”都是按照您的预期触发的,无论您按键的速度有多快。浏览器本身只是在经过一段时间后才切换所选选项


有没有办法绕过这个问题?

克隆似乎是可能的。这是一个非常肮脏的黑客行为,但在Chrome中效果很好:


我是通过中断keyevent并在函数顶部放置一个
preventDefault()
来实现的。我使用回车键来打破延迟,并提交我已经键入的内容

if (eventinfo.keyCode == 13) {
    eventinfo.preventDefault();
    var search = document.getElementById("searchtag");
    var value = search.value;
    mainPage.searchAdd(value).done(
        function () {
           search.value = "";
           search.focus();
        }
    );
}

浏览器可能会搜索以“BZ”开头的值(失败),而不是跳转到以“Z”开头的值。我想你可以重写关键事件并自己找到值,但这不是一个很好的解决方案。它在浏览器中的工作方式是搜索你键入的内容。如果您键入bz,它将搜索从bz开始的内容。这有助于在那些该死的三次下拉框中输入您的出生年份,因此您可以只键入1984或其他任何内容。如果您暂停片刻,浏览器会“忘记”您键入的内容,当您再次键入时,您将开始新的“搜索”。最接近实际解决方案。恭喜,您现在得到了最佳答案。而且只晚了5年。:)
if (eventinfo.keyCode == 13) {
    eventinfo.preventDefault();
    var search = document.getElementById("searchtag");
    var value = search.value;
    mainPage.searchAdd(value).done(
        function () {
           search.value = "";
           search.focus();
        }
    );
}