Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/361.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/71.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 阻止或检测来自自动完成列表内部的关键事件_Javascript_Html - Fatal编程技术网

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;
  }
}