【问题标题】:Prevent blur on second element when refocusing an element from a blur event (IE8 only)从模糊事件重新聚焦元素时防止第二个元素模糊(仅限 IE8)
【发布时间】:2012-08-16 13:14:35
【问题描述】:

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

在 chrome 中,如果您先关注第一个文本框,然后尝试关注第二个文本框,您会看到以下事件发生顺序:

  1. 从 text1 触发焦点
  2. 从 text1 发出的模糊
  3. 从 text1 触发焦点

但是,在 IE8 中,您会看到:

  1. LOG:从 text1 触发焦点
  2. LOG:从 text1 触发的模糊
  3. LOG:从 text1 触发焦点
  4. LOG:从 text2 触发焦点
  5. LOG:从 text2 触发的模糊
  6. LOG:从 text1 触发焦点

在第一个文本框被重新聚焦的情况下,我需要能够防止在第二个文本框上触发焦点和模糊事件。

Here is a fiddle 演示了这个问题。该行为仅发生在 IE8 中。

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

【问题讨论】:

  • 您能否提供重现该问题的步骤?当我从第一个文本字段中选择时,它会触发 blur1 focus1 focus2 但 1 不会重新获得焦点(FF17)。
  • @FabrícioMatté 添加到问题中
  • 我明白了。我认为您可能希望在第二个框获得焦点而不是第一个框模糊时触发第一个框的验证。似乎至少可以解决 FF17 的问题。 jsfiddle.net/ult_combo/zeeth/1(创建更多的处理程序触发,但可以避免)
  • @FabrícioMatté 只有在第一个元素的验证失败时才会重新聚焦 - 第二个文本框无法知道这一点,所以我无法移动 focus() 调用。
  • 那会有点棘手。setTimeout(function() { $('#text1').focus(); }, 0); 很丑,会触发第二个文本框的事件,但也会处理它。

标签: javascript jquery events


【解决方案1】:

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

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

这是一个 hack,但是在处理有问题的浏览器时,你必须使用一些 hack...

【讨论】:

  • 这与我最终所做的非常相似。我正在存储一个未通过验证的元素列表,并在发生其他一些事情后呈现该列表,因此从第二个文本框触发模糊的事实不再相关。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-12
  • 2019-10-27
  • 1970-01-01
相关资源
最近更新 更多