Javascript 当从模糊事件中重新聚焦某个元素时,防止第二个元素模糊(仅限IE8)

Javascript 当从模糊事件中重新聚焦某个元素时,防止第二个元素模糊(仅限IE8),javascript,jquery,events,Javascript,Jquery,Events,我有两个文本框,都有通过jQuery处理的模糊事件。当文本框模糊时,会发生一些验证,如果验证失败,文本框会重新聚焦(我知道这是一个糟糕的想法,但在这种情况下这是理想的行为) 在chrome中,如果您聚焦第一个文本框,然后尝试聚焦第二个文本框,您将看到事件发生的顺序: 焦点从text1触发 从text1触发的模糊 焦点从text1触发 但是,在IE8中,您将看到: 日志:焦点从text1激发 日志:从text1触发模糊 日志:焦点从text1激发 日志:焦点从text2激发 日志:从text2触发

我有两个文本框,都有通过jQuery处理的模糊事件。当文本框模糊时,会发生一些验证,如果验证失败,文本框会重新聚焦(我知道这是一个糟糕的想法,但在这种情况下这是理想的行为)

在chrome中,如果您聚焦第一个文本框,然后尝试聚焦第二个文本框,您将看到事件发生的顺序:

  • 焦点从text1触发
  • 从text1触发的模糊
  • 焦点从text1触发
  • 但是,在IE8中,您将看到:

  • 日志:焦点从text1激发
  • 日志:从text1触发模糊
  • 日志:焦点从text1激发
  • 日志:焦点从text2激发
  • 日志:从text2触发模糊
  • 日志:焦点从text1激发
  • 如果第一个文本框被重新聚焦,我需要能够防止焦点和模糊事件在第二个文本框上触发。

    展示这个问题。这种行为只发生在IE8中


    更多信息:所有这些事件处理程序都绑定在单独的私有范围内,因此这两个文本框无法(据我所知)与彼此的处理程序函数交互。

    虽然我不喜欢全局状态,但似乎无法说服IE8不要在第二个文本区域触发另一个模糊事件,所以你必须解决这个问题。由于第一个文本区域上的模糊事件在第二个文本区域聚焦之前发送,因此您可以:

    • 检查验证是否失败,如果失败,请在全局变量中标记当前正在验证textarea1
    • 在焦点/模糊上,如果正在验证另一个元素而不是当前元素,只需忽略事件并返回
    • 如果验证成功,请从全局变量中删除当前正在验证的元素

    这是一种黑客行为,但在处理有缺陷的浏览器时,您必须使用一些黑客行为…

    您能提供重现该问题的步骤吗?当我从第一个文本字段中选择tab键时,它会触发
    blur1 focus1 focus2
    ,但1无法恢复焦点(FF17)。@fabriciomatté添加到我看到的问题中。我认为您可能希望在第二个框获得焦点时启动第一个框的验证,而不是在第一个框模糊时启动。至少对于FF17来说,这似乎解决了这个问题。(创建了一些可以避免的处理程序触发)@fabriciomatté只有在第一个元素的验证失败时才发生重新聚焦-第二个文本框无法知道这一点,因此我无法移动focus()调用。这将有点棘手。。A
    setTimeout(函数(){$('#text1').focus();},0)
    很难看,会触发第二个文本框的事件,但也会处理它。这与我最后做的非常相似。我正在存储一个未通过验证的元素列表,并在其他事情发生后呈现该列表,因此从第二个文本框触发模糊的事实不再相关。