这让我抓狂。这很难解释,但我会试一试。
我的网站首页上有一个输入文本字段。我已经编写了一个 keydown 事件观察器,它检查 keyCode,如果它的 ENTER(或等效),它将检查输入值(电子邮件)。如果电子邮件在数据库中有效且唯一,它将提交表单。基本的东西,或者你会这么想。
如果我在字段中输入我的电子邮件地址并按回车键,它在所有浏览器中都可以正常工作。但是,如果我键入前几个字母,然后使用箭头键从历史记录下拉框中选择电子邮件(希望你明白我的意思),然后按回车键,结果就不同了。表单字段的值仅作为我键入的几个字母被捕获,因此验证失败。似乎当我按回车键从历史记录下拉列表中“选择”电子邮件时,浏览器会打断它,就好像我正在打字一样。
在 Chrome 和 Safari 中,它可以正常工作。正如它应该意味着当您按回车键从历史记录下拉列表中“选择”电子邮件时,它所做的只是将该电子邮件地址放入文本框中。只有在第二次按下 ENTER 键时,它才会触发事件观察器,并验证电子邮件。
希望有人能阐明为什么会发生这种情况...我的直觉是它是浏览器问题,我无法修复。
谢谢 李
编辑: 为了澄清我的问题,让我补充说我使用“keydown”事件来捕捉按下回车键的时刻。我已经尝试了“keyup”事件,这解决了我上面的问题,但后来我似乎无法停止自己提交表单。 “keyup”事件在默认行为之后触发,因此它不是正确的选择。
进一步编辑:
再次感谢你,顺便说一句,你的英语很好(回应你对英语不好的评论)。
我已经更改了我的事件处理程序:
$("emailInputBox").observe("keydown", function(event) {
return submitViaEnter(event, submitSignupFormOne);
});
为此:
$("emailInputBox").observe("keydown", function(event) {
setTimeout(submitViaEnter.curry(event, submitSignupFormOne),0);
});
提交ViaEnter:
function submitViaEnter(event, callback) {
var code = event.keyCode;
if (code == Event.KEY_RETURN) {
event.stop();
return callback(event);
}
return true;
}
似乎可行,但现在的问题是允许浏览器在运行 submitViaEnter 函数之前执行默认操作,这意味着当我按下 ENTER 时正在提交表单。
最佳答案
原始问题的答案
是的,这是一个 Gecko 错误(虽然不是 Mac 特有的)。
The last part of this comment包含解决方法的描述:使用超时。
[edit] 因为你要求澄清错误
当您按下 Enter 并且自动完成处于事件状态时,Firefox(错误地)首先触发页面的键处理程序,然后浏览器的内部键处理程序关闭自动完成弹出窗口并更新文本区域值,而它应该只是触发它在自动完成弹出窗口中,只让页面知道文本框值已更改。
这意味着当您的键处理程序被调用时,自动完成的处理程序尚未运行——自动完成弹出窗口仍然打开,文本框值就像自动完成发生之前一样。
当您将 setTimeout 调用添加到您的 key 处理程序时,您是在对浏览器说“嘿,在您完成 P1 待办事项列表中已经完成的事情后立即运行此功能”。所以自动完成的处理程序运行,因为它已经在待办事项列表中,然后您放置在超时上的代码运行 - 当自动完成弹出窗口已经关闭并且文本框的值已更新时。
[edit] 回答“进一步编辑”中的问题
没错。如果你想让它起作用,你需要在事件处理程序中取消默认操作,而不是在超时中:
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 上提交表单,这将是一个更有趣的练习,但您似乎并没有这样做。
关于javascript - 我在 Mac 上的 Firefox 中遇到 keydown 事件和自动完成问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2303955/
我的最终目标是安装当前版本的RubyonRails。我在OSXMountainLion上运行。到目前为止,这是我的过程:已安装的RVM$\curl-Lhttps://get.rvm.io|bash-sstable检查已知(我假设已批准)安装$rvmlistknown我看到当前的稳定版本可用[ruby-]2.0.0[-p247]输入命令安装$rvminstall2.0.0-p247注意:我也试过这些安装命令$rvminstallruby-2.0.0-p247$rvminstallruby=2.0.0-p247我很快就无处可去了。结果:$rvminstall2.0.0-p247Search
我想设置一个默认日期,例如实际日期,我该如何设置?还有如何在组合框中设置默认值顺便问一下,date_field_tag和date_field之间有什么区别? 最佳答案 试试这个:将默认日期作为第二个参数传递。youcorrectlysetthedefaultvalueofcomboboxasshowninyourquestion. 关于ruby-on-rails-date_field_tag,如何设置默认日期?[rails上的ruby],我们在StackOverflow上找到一个类似的问
我将我的Rails应用程序部署到OpenShift,它运行良好,但我无法在生产服务器上运行“Rails控制台”。它给了我这个错误。我该如何解决这个问题?我尝试更新rubygems,但它也给出了权限被拒绝的错误,我也无法做到。railsc错误:Warning:You'reusingRubygems1.8.24withSpring.UpgradetoatleastRubygems2.1.0andrun`gempristine--all`forbetterstartupperformance./opt/rh/ruby193/root/usr/share/rubygems/rubygems
我使用的是Firefox版本36.0.1和Selenium-Webdrivergem版本2.45.0。我能够创建Firefox实例,但无法使用脚本继续进行进一步的操作无法在60秒内获得稳定的Firefox连接(127.0.0.1:7055)错误。有人能帮帮我吗? 最佳答案 我遇到了同样的问题。降级到firefoxv33后一切正常。您可以找到旧版本here 关于ruby-无法在60秒内获得稳定的Firefox连接(127.0.0.1:7055),我们在StackOverflow上找到一个类
我正在尝试从Postgresql表(table1)中获取数据,该表由另一个相关表(property)的字段(table2)过滤。在纯SQL中,我会这样编写查询:SELECT*FROMtable1JOINtable2USING(table2_id)WHEREtable2.propertyLIKE'query%'这工作正常:scope:my_scope,->(query){includes(:table2).where("table2.property":query)}但我真正需要的是使用LIKE运算符进行过滤,而不是严格相等。然而,这是行不通的:scope:my_scope,->(que
当我尝试安装Ruby时遇到此错误。我试过查看this和this但无济于事➜~brewinstallrubyWarning:YouareusingOSX10.12.Wedonotprovidesupportforthispre-releaseversion.Youmayencounterbuildfailuresorotherbreakages.Pleasecreatepull-requestsinsteadoffilingissues.==>Installingdependenciesforruby:readline,libyaml,makedepend==>Installingrub
我想将我的MacSnowLeopardruby从1.8.7升级到1.9.1版本,有人知道轻松且最好的升级方法吗?因为我读了一些论坛/帖子/博客/讨论说覆盖苹果发布的ruby不好将Rails从版本2.2.2升级到2.3.8的最佳方法是什么?因为我找到的所有信息都仅适用于豹/老虎,而且很少有关于雪豹的复杂文章。他们还说覆盖apple提供的rails不好吗。谁能帮帮我?谢谢。 最佳答案 DanBenjamin有一些greatinstructionsforcompilingandinstallingRuby,RubyGemsandRai
我最近决定从我的系统中卸载RVM。在thispage提出的一些论点说服我:实际上,我的决定是,我根本不想担心Ruby的多个版本。我只想使用1.9.2-p290版本而不用担心其他任何事情。但是,当我在我的Mac上运行ruby--version时,它告诉我我的版本是1.8.7。我四处寻找如何简单地从我的Mac上卸载这个Ruby,但奇怪的是我没有找到任何东西。似乎唯一想卸载Ruby的人运行linux,而使用Mac的每个人都推荐RVM。如何从我的Mac上卸载Ruby1.8.7?我想升级到1.9.2-p290版本,并且我希望我的系统上只有一个版本。 最佳答案
是否有简单的方法来更改默认ISO格式(yyyy-mm-dd)的ActiveAdmin日期过滤器显示格式? 最佳答案 您可以像这样为日期选择器提供额外的选项,而不是覆盖js:=f.input:my_date,as::datepicker,datepicker_options:{dateFormat:"mm/dd/yy"} 关于ruby-on-rails-事件管理员日期过滤器日期格式自定义,我们在StackOverflow上找到一个类似的问题: https://s
我正在尝试将以下SQL查询转换为ActiveRecord,它正在融化我的大脑。deletefromtablewhereid有什么想法吗?我想做的是限制表中的行数。所以,我想删除少于最近10个条目的所有内容。编辑:通过结合以下几个答案找到了解决方案。Temperature.where('id这给我留下了最新的10个条目。 最佳答案 从您的SQL来看,您似乎想要从表中删除前10条记录。我相信到目前为止的大多数答案都会如此。这里有两个额外的选择:基于MurifoX的版本:Table.where(:id=>Table.order(:id).