Javascript 当从模糊事件中重新聚焦某个元素时,防止第二个元素模糊(仅限IE8)
我有两个文本框,都有通过jQuery处理的模糊事件。当文本框模糊时,会发生一些验证,如果验证失败,文本框会重新聚焦(我知道这是一个糟糕的想法,但在这种情况下这是理想的行为) 在chrome中,如果您聚焦第一个文本框,然后尝试聚焦第二个文本框,您将看到事件发生的顺序:Javascript 当从模糊事件中重新聚焦某个元素时,防止第二个元素模糊(仅限IE8),javascript,jquery,events,Javascript,Jquery,Events,我有两个文本框,都有通过jQuery处理的模糊事件。当文本框模糊时,会发生一些验证,如果验证失败,文本框会重新聚焦(我知道这是一个糟糕的想法,但在这种情况下这是理想的行为) 在chrome中,如果您聚焦第一个文本框,然后尝试聚焦第二个文本框,您将看到事件发生的顺序: 焦点从text1触发 从text1触发的模糊 焦点从text1触发 但是,在IE8中,您将看到: 日志:焦点从text1激发 日志:从text1触发模糊 日志:焦点从text1激发 日志:焦点从text2激发 日志:从text2触发
更多信息:所有这些事件处理程序都绑定在单独的私有范围内,因此这两个文本框无法(据我所知)与彼此的处理程序函数交互。虽然我不喜欢全局状态,但似乎无法说服IE8不要在第二个文本区域触发另一个模糊事件,所以你必须解决这个问题。由于第一个文本区域上的模糊事件在第二个文本区域聚焦之前发送,因此您可以:
- 检查验证是否失败,如果失败,请在全局变量中标记当前正在验证textarea1
- 在焦点/模糊上,如果正在验证另一个元素而不是当前元素,只需忽略事件并返回
- 如果验证成功,请从全局变量中删除当前正在验证的元素
这是一种黑客行为,但在处理有缺陷的浏览器时,您必须使用一些黑客行为…您能提供重现该问题的步骤吗?当我从第一个文本字段中选择tab键时,它会触发
blur1 focus1 focus2
,但1无法恢复焦点(FF17)。@fabriciomatté添加到我看到的问题中。我认为您可能希望在第二个框获得焦点时启动第一个框的验证,而不是在第一个框模糊时启动。至少对于FF17来说,这似乎解决了这个问题。(创建了一些可以避免的处理程序触发)@fabriciomatté只有在第一个元素的验证失败时才发生重新聚焦-第二个文本框无法知道这一点,因此我无法移动focus()调用。这将有点棘手。。AsetTimeout(函数(){$('#text1').focus();},0)
很难看,会触发第二个文本框的事件,但也会处理它。这与我最后做的非常相似。我正在存储一个未通过验证的元素列表,并在其他事情发生后呈现该列表,因此从第二个文本框触发模糊的事实不再相关。