Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/9.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/7/jsf/5.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 我在mac上的Firefox中遇到按键关闭事件和自动完成问题_Javascript_Macos_Firefox_Prototypejs_Keycode - Fatal编程技术网

Javascript 我在mac上的Firefox中遇到按键关闭事件和自动完成问题

Javascript 我在mac上的Firefox中遇到按键关闭事件和自动完成问题,javascript,macos,firefox,prototypejs,keycode,Javascript,Macos,Firefox,Prototypejs,Keycode,这让我快发疯了。这很难解释,但我要试一试 我的网站首页上有一个输入文本字段。我已经编写了一个keydown事件观察器来检查keyCode,如果它是ENTER或equiv,它将检查输入值email。如果电子邮件在DB itll中有效且唯一,请提交表格。基本的东西,或者你会这么想 如果我在字段中键入电子邮件地址并按enter键,它在所有浏览器中都可以正常工作。但是,如果我键入前两个字母,然后使用箭头键从历史记录下拉框中选择电子邮件,希望您知道我在这里的意思,然后按enter键,结果会有所不同。表单字

这让我快发疯了。这很难解释,但我要试一试

我的网站首页上有一个输入文本字段。我已经编写了一个keydown事件观察器来检查keyCode,如果它是ENTER或equiv,它将检查输入值email。如果电子邮件在DB itll中有效且唯一,请提交表格。基本的东西,或者你会这么想

如果我在字段中键入电子邮件地址并按enter键,它在所有浏览器中都可以正常工作。但是,如果我键入前两个字母,然后使用箭头键从历史记录下拉框中选择电子邮件,希望您知道我在这里的意思,然后按enter键,结果会有所不同。表单字段的值被捕获为我键入的两个字母,因此验证失败。似乎当我按enter键从历史记录下拉列表中选择电子邮件时,浏览器正在中断,就好像我正在键入一样

在Chrome和Safari中,它可以正常工作。这意味着,当您按enter键从历史记录下拉列表中选择电子邮件时,它所做的只是将该电子邮件地址放入文本框中。只有在第二次按ENTER键时,它才会触发事件观察者,并验证电子邮件

希望有人能解释为什么会这样。。。我的直觉是,这是一个浏览器的东西,将是我无法修复的东西

谢谢 背风

编辑: 为了澄清我的问题,让我补充一点,我使用keydown事件捕捉按下enter键的瞬间。我已经尝试了keyup事件,这解决了我上面的问题,但是我似乎无法阻止表单自己提交。keyup事件在默认行为之后触发,因此它不是正确的选择

进一步编辑:

再次感谢你,顺便说一句,你的英语非常好,回应了你关于糟糕英语的评论

我已将事件处理程序更改为:

$("emailInputBox").observe("keydown", function(event) {
    return submitViaEnter(event, submitSignupFormOne);
});
为此:

$("emailInputBox").observe("keydown", function(event) {
    setTimeout(submitViaEnter.curry(event, submitSignupFormOne),0);
});
submitViaEnter:

似乎可以工作,但现在的问题是,在运行SubmitViaCenter功能之前,允许浏览器执行默认操作,这意味着当我按ENTER键时表单正在提交。

回答原始问题

是的,这是一个壁虎虫,但不是Mac专用的

包含解决方法的说明:使用超时

[编辑]因为您要求澄清错误

当您按Enter键且自动完成处于活动状态时,Firefox会错误地首先触发页面的键处理程序,然后触发浏览器的内部键处理程序,关闭自动完成弹出窗口并更新文本区域值,而可以说,它应该只在自动完成弹出窗口时触发,并且只让页面知道文本框值已更改

这意味着,当调用密钥处理程序时,自动完成的处理程序尚未运行-自动完成弹出窗口仍处于打开状态,文本框值与自动完成之前的值相同

当您向密钥处理程序添加setTimeout调用时,您是在对浏览器说嘿,在完成P1待办事项列表中的工作后立即运行此函数。因此,自动完成的处理程序会运行,因为它已经在待办事项列表中,然后,当自动完成弹出窗口已经关闭且文本框的值已更新时,您在超时状态下放置的代码会运行

[编辑]回答进一步编辑中的问题

对。如果要使其工作,则需要在事件处理程序中取消默认操作,而不是在超时中:

function onKeyPress(ev) {
  if (... enter pressed ...) {
    setTimeout(function() {
      ... check the new textbox value after letting autocomplete work ...
    }, 0);
    // but cancel the default behavior (submitting the form) directly in the event listener
    ev.preventDefault();
    return false;
  }
}

如果您仍然希望在Enter上提交表单,这将是一个更有趣的练习,但您似乎没有这样做。

好吧。非常感谢你的帮助。这是我以前错过的咖喱功能。我试图在setTimeout函数的作用域内处理事件

这在下面起作用。从eventobserver调用SubmitViaCenter,并响应keyDown事件:

function submitViaEnter(event, callback) {
var code = event.keyCode;
if (code == Event.KEY_RETURN) {
    event.stop();
    setTimeout(callback.curry(event),0);        
    // return callback(event);
    // return false;    
}
return true;
}

停止eventObserver中的默认操作意味着无法键入任何字符。因此,我将if-ENTER-key子句插入其中。

谢谢!!我通过禁用表单的自动完成功能来解决这个问题,但我不喜欢它。你知道什么是暂停时间吗?如果知道,你能详细说明一下吗?再次感谢。@LeeRM:在keydown处理程序中调用setTimeouthandler2,0并将验证代码移到|函数handler2{}|中。哦,我明白了。如果我在这里太胖了,我很抱歉。就在我觉得我越来越擅长这件事的时候。。。结果如何?我知道它解决了我的问题,但是如何解决呢?我想知道发生了什么事。谢谢你的帮助!谢谢你花时间为我做这件事!我真的很感激。那么零超时可以吗?@LeeRM:应该可以-我解释了理论-但我没有实际测试它。如果零超时不起作用,则增加超时值将是一种攻击,因为它使结果取决于时间 事件。因此,如果零超时由于某种原因不起作用,我会感到惊讶,需要更仔细地研究它。
function submitViaEnter(event, callback) {
var code = event.keyCode;
if (code == Event.KEY_RETURN) {
    event.stop();
    setTimeout(callback.curry(event),0);        
    // return callback(event);
    // return false;    
}
return true;
}