Javascript 阻止或检测来自自动完成列表内部的关键事件
我有一个有多个堆叠的Javascript 阻止或检测来自自动完成列表内部的关键事件,javascript,html,Javascript,Html,我有一个有多个堆叠的框的表单,我检查表单的键下是否有“回车”键,如果出现这种情况,向下移动到下一个输入,并返回false以防止表单提交。(是的,这是老派的方式……但我想支持传统浏览器) 及 问题是,如果我在输入中按下向下箭头,自动完成列表打开,我可以像往常一样使用鼠标从该列表中选择一个值,但是如果我使用箭头键选择一个值,然后按“回车”选择该值,我的事件会阻止Firefox 61和Edge 42中发生这种情况(但在Chrome67中,它确实可以像预期的那样工作)。这使得在没有鼠标的情况下,aut
框的表单,我检查表单的键下是否有“回车”键,如果出现这种情况,向下移动到下一个输入,并返回false以防止表单提交。(是的,这是老派的方式……但我想支持传统浏览器)
及
问题是,如果我在输入中按下向下箭头,自动完成列表打开,我可以像往常一样使用鼠标从该列表中选择一个值,但是如果我使用箭头键选择一个值,然后按“回车”选择该值,我的事件会阻止Firefox 61和Edge 42中发生这种情况(但在Chrome67中,它确实可以像预期的那样工作)。这使得在没有鼠标的情况下,autocomplete无法使用
我的问题是:当焦点在自动完成历史记录列表中而不是在元素本身中时,我是否可以阻止keydown事件触发?或者,我的事件是否可以检测到自动完成列表正在显示?我想输入在自动完成列表中按下以执行其默认行为,即选择自动完成条目
请注意,Chrome可能避免了这个问题,因为在浏览自动完成列表时,
中的值会发生变化
请注意,更改为使用keypress
事件(而不是keydown
)没有任何区别(至少在FF 61中是这样)。结果表明,干扰自动完成的是而不是
return false;
相反,这是我将焦点设置到下一个表单元素的部分。这解决了我遇到的具体问题(请注意,更改为keydown
,而不是keypress
,这是必要的):
及
i、 e.使用setTimeout()
将焦点更改推迟到按键事件完成后
因此,我回答了我的具体问题,即修复本例中的自动完成行为。但我仍然不知道我提出的一般问题的答案,即:
当焦点位于内部时,我是否可以阻止keydown事件触发
自动完成历史记录列表,而不是在元素本身内部?
或者,我的事件是否可以检测到自动完成
列表正在显示
例如,我有另一个页面,我想在其中输入一个“Enter”-在一个
中按以执行特定的操作,只有当按下该按钮选择一个自动完成条目时才需要
…因此,如果有人对更普遍的问题有解决方案,请发布它!我认为一个好的方法是阻止阻止
的提交事件,而不是按键事件。如果你使用任何插件,你应该提供自动完成插件的名称。.没有插件!我说的是浏览器的autocomplete功能。插件本质上更易于从javascript代码中调整。(至少,如果你是指页面加载的javascript插件的话)。让我重新解释一下,为什么不阻止表单提交的默认操作而不是处理关键事件?@zero298刚刚尝试了它,但它并没有解决问题。结果表明,将焦点设置为keydown
或keypress
事件中的另一个元素就足以导致问题;返回fal无关紧要se与否…所以整个块表单提交方面都是一条红鲱鱼。但这给了我一个提示,我找到了一个答案…发布在下面。
function checkEnter(e)
{
e = e||window.event;
var el, tag, typ, k = e.keyCode||e.which;
if ((k===13)&&(el = e.target||e.srcElement)&&(((tag = el.tagName)==="SELECT")||((tag==="INPUT")&&((typ = el.type)!=="submit")&&(typ!=="reset")&&(typ!=="button"))))
{
// focus next form element
// ...
return false;
}
}
return false;
form.onkeypress = checkEnter;
function checkEnter(e)
{
e = e||window.event;
var el, tag, typ, nextEl, k = e.keyCode||e.which;
if ((k===13)&&(el = e.target||e.srcElement)&&(((tag = el.tagName)==="SELECT")||((tag==="INPUT")&&((typ = el.type)!=="submit")&&(typ!=="reset")&&(typ!=="button"))))
{
// nextEl = form element to switch focus to next
// ...
if (nextEl) setTimeout(function(){nextEl.focus()},0);
return false;
}
}