我有一个在Bootbox(它本身是Bootstrap模态的顶层)上创建的表单。创建完成后,我会致电
$('#myForm').validate()
在上面。
该行为的理想部分是,当用户在表单中切换时,他们可以立即看到他们弄乱了其中一个字段的反馈。在点击“选项卡”或单击其他位置之前输入了非电子邮件地址?警告和错误消息。太好了!
但是令人不快的是,模糊吞噬了其他事件。因此,如果用户选择单击“取消”(完全知道该表单无效),则不会听到单击取消的消息,并且其处理程序也不会触发。第二次单击(现在焦点完全不在窗体上)并按预期取消触发。我不希望用户单击两次。
我看到了一种完全禁用模糊的技术,但是随后失去了上述理想的行为,我也不希望这样做。理想情况下,我追求的是“嗯,我很模糊,但我也知道用户在点击什么”。
[编辑添加:]
我已经注意到这很令人困惑,所以让我尝试一种不同的方法:是否可以处理表单(已调用.validate()
),然后单击在整个页面上的任何其他可点击项目上,并成功触发其点击处理程序?
[再次编辑:]
基于Sparky的演示,我连线了一个警告,以在模糊时在输入下方显示。因此,要查看实际问题,请启动此小提琴:https://jsfiddle.net/bd1fhpu3/
然后在单击“仅一个按钮”之前,单击输入字段之一。单击“只是一个按钮”的上半部分,以确保在释放鼠标按钮时警告标签已将其从光标的热点中挤出。
无论如何,这只是说明问题所在。解决该问题可能不在问题范围之内,但是似乎值得分享,以防其他人遇到此问题。要解决此问题,我要么需要将Bootbox的click事件重写为一个mousedown事件,而不是单击(然后您无需按下并释放),要么我可以通过避免重新定位来“解决问题”按钮。可能是一个静态高度对话框,其高度足以容纳表格和任何可能的警告。绝对有点像这样的“ hack”,因为您永远不知道以后是否要做其他会使问题再次出现的事情。但这将是一个快速简便的临时修复程序。
答案 0 :(得分:0)
您无法使用内置的onfocuout
函数,因为JavaScript可能无法知道聚焦到另一个字段和聚焦到取消按钮之间的区别。
您必须完全禁用onfocusout
并编写一些自定义事件处理程序。
您的代码稀疏,所以我的回答将非常通用。
$('#myForm').validate({
// other options here
onfocusout: false; // disable default blur event
});
然后编写一个事件处理程序,当他们将焦点放在input
上时以编程方式触发对表单的验证,而当他们将焦点放在任何内容(如取消按钮)上时将不执行任何操作。
$('#myForm input').on('focus', function() {
$('#myForm').valid(); // trigger validation on the form
});
但是,这将触发整个表单的验证。如果您只想触发失去焦点的一个领域的验证,那么您将回到平方,因为该事件只知道失去了焦点,而不是知道去向何方。
答案 1 :(得分:0)
仅出于后代考虑,这是一个“答案”。也许有一天会有帮助。你就是永远不知道。
没有代码在“错误地”运行,因此实际上没有提供修复程序或代码示例。这是正在发生的事情:
但是,在#4中,由于“取消”按钮不再位于光标下方,因此绑定到该按钮的click事件监听器不会触发。
该演示(只要存在于互联网上,将在下面的评论中)。但是,提供与之配套的代码示例是没有意义的。演示结束后,我将删除评论。
到目前为止,我选择不执行的可能步骤(解决方法/黑客):
visibility: none
而不是display: non
e隐藏它们。前者会隐藏文本,但仍保留文本的垂直空间,后者则不会(因此,为什么模态会扩展)。这将防止在聚焦事件期间按钮可能移动。您将获得额外的空格,但是您可以通过删除表单组的底部边距来消除其中的一些空白(假设您正在使用它)我确定还有其他解决方法,但这是一个起点。