gpt4 book ai didi

jquery - 在焦点上接收两个 `focusin` 事件

转载 作者:行者123 更新时间:2023-12-03 23:05:42 26 4
gpt4 key购买 nike

我在做什么

在代码的某些部分,我有一个针对 focusin 事件的监听器,而在另一部分中,我以编程方式将焦点设置在 input 上。在 Chrome、Safari、Firefox 上,事件监听器被调用一次,但在 IE(包括 IE10)上,它被调用两次。我用 jQuery 的 .on() 注册监听器并使用 jQuery 的 .focus() 设置焦点。请参阅下面的示例的完整源代码,该示例显示了此行为,如果您愿意,您可以 run that example .

问题

  1. 即使不使用 jQuery,IE 也会触发 focusin 两次。仅当以编程方式设置焦点时才会执行此操作,而不是在用户选项卡或单击该字段时执行此操作。为什么?这只是一个 IE 错误,还是 IE 有充分的理由这样做?
  2. 不管是不是IE的bug,jQuery不应该在这里消除IE和其他浏览器之间的差异吗?换句话说,这样做不是 jQuery bug 吗?
  3. 您将如何解决这个问题? (也就是说,无论焦点是通过编程方式还是由用户设置,我都可以让每个焦点仅运行一次代码。)

完整来源

<!DOCTYPE html>
<html>
<head>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js"></script>
<script>
$(function() {
$('input').on('focusin', function() {
var c = $('#count');
$('#count').text(1 + parseInt(c.text()));
console.log('focusin');
});
$('input').focus();
});
</script>
</head>
<body>
<input>
<code>focusin</code> received: <span id="count">0</span>.
</body>
</html>

最佳答案

这绝对是IE问题。来自 JQuery 1.9 upgrade guide :

Unfortunately, all versions of Internet Explorer (6 through 10) fire focus events asynchronously. When you .trigger("focus") in IE, jQuery won't "see" the async focus event which will occur later, so it fires one of its own to ensure that a focus event always occurs as described above. This causes two calls to the event handler. To avoid this double-call--but risk that the event handler is not called at all--use the DOM focus method directly, e.g., $("selector").get(0).focus().

我使用了$('input').get(0).focus(),它在页面加载上不太一致。如果我将代码移动到按钮,那么我就会始终触发 focusin 事件。

关于jquery - 在焦点上接收两个 `focusin` 事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14410075/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com