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

4
我有两个文本框,都通过jQuery处理模糊事件。当文本框模糊时,会进行一些验证,如果验证失败,则重新聚焦文本框(一个可怕的想法,我知道,但在这种情况下这是期望的行为)。
在Chrome中,如果你将焦点放在第一个文本框上,然后尝试将焦点放在第二个上,你会看到以下事件发生的顺序:
1. 来自 text1 的焦点事件。 2. 来自 text1 的模糊事件。 3. 来自 text1 的焦点事件。
然而,在 IE8 中,您会看到以下内容:
1. 日志:来自 text1 的焦点事件。 2. 日志:来自 text1 的模糊事件。 3. 日志:来自 text1 的焦点事件。 4. 日志:来自 text2 的焦点事件。 5. 日志:来自 text2 的模糊事件。 6. 日志:来自 text1 的焦点事件。 我需要能够防止第一个文本框被重新聚焦时第二个文本框触发焦点和模糊事件。 这里是一个演示问题的fiddle。此行为只在IE8中发生。
更多信息:所有这些事件处理程序都绑定在单独的私有作用域中,因此两个文本框没有任何方式(据我所知)与彼此的处理程序函数交互。

你能提供重现问题的步骤吗?当我从第一个文本字段切换时,它会触发 blur1 focus1 focus2 但是1无法重新获得焦点(FF17)。 - Fabrício Matté
我明白了。我认为你可能想在第二个框获得焦点时触发第一个框的验证,而不是在第一个框失去焦点时触发验证。这似乎至少可以解决 FF17 的问题。http://jsfiddle.net/ult_combo/zeeth/1/(尽管会创建一些额外的处理程序触发,但可以避免)。 - Fabrício Matté
@FabrícioMatté 只有在第一个元素的验证失败时,重新聚焦才会发生 - 第二个文本框无法知道此情况,因此我无法移动focus()调用。 - jbabey
那就有点棘手了..一个 setTimeout(function() { $('#text1').focus(); }, 0); 很丑陋,但会触发第二个文本框的事件并将其处理好。 - Fabrício Matté
@FabrícioMatté 的目标是不触发第二个文本框的事件。 - jbabey
这就是我所说的“棘手”。完全跨浏览器防止模糊事件并不简单,因此我上面发布的两段代码只有在您在第二个文本框函数的开头调用前一个文本框的验证并基于前一个文本框的验证返回false时才能起作用。但我会看看是否有更简单的方法。 - Fabrício Matté
1个回答

0

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

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

这是一种hack方法,但当处理有缺陷的浏览器时,你必须使用一些hack方法...


这与我最终所做的非常相似。我正在存储一系列未通过验证的元素,并在发生其他事情后呈现该列表,因此第二个文本框触发模糊事件的事实不再相关。 - jbabey

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接