我有这个代码:
$("body").on("focus", ".input", function () {
$("body").append("loop<br>");
$(this).find("input").focus();
});
小提琴:
http://jsfiddle.net/Hc3D8/
为什么会循环?
它循环是因为您将函数附加到focus
事件,该函数本身会触发focus
事件。
即使您在内部input
元素上调用 focus
事件,它仍会冒泡到外部.input
元素。
要解决此问题,您可以挂接到外部元素上的其他事件:
$("body").on("click", ".input", function () { // click event
$("body").append("loop<br>");
$(this).find("input").focus();
});
或者您可以在input
的focus
停止传播:
$("body")
.on("focus", ".input", function () {
$("body").append("loop<br>");
$(this).find("input").focus();
})
.on('focus', 'input', function(e) {
e.stopPropagation();
});
示例小提琴
它循环是因为您在事件处理程序中再次调用了元素上的.focus()
,这会触发同一元素上的focus
事件,从而再次触发事件处理程序,导致它永远循环。
只需删除$(this).find("input").focus();
编辑:要停止事件传播(并防止focus
input
冒泡 DOM 以.input
并导致循环),请将您的代码更改为:
$("body").on("focus", ".input", function () {
$("body").append("loop<br>");
$(this).find("input").focus(function(e){ e.stopPropagation(); } );
});
更新的 JSFiddle
因为这会在正文中找到输入并聚焦它并再次调用此焦点事件。所以它是无限循环。
$("body").on("focus", ".input", function () {
$("body").append("loop<br>");
$(this).find("input").focus(); //this finds the input in body and focus it and call this function again
});
删除$(this).find("input").focus();
$("body").on("focus", ".input", function () {
$("body").append("loop<br>");
});
它循环是因为代码中的最后一行:
$(this).find("input").focus();
因此,由于它有一个附加的事件以焦点运行,因此它将循环。
IE,Safari,Opera,Firefox没有产生这样的问题,但chrome正在解决这个问题。 所以解决这个问题,我们必须使用一些技巧。我正在提供自己的解决方案,即我使用了可见性为 false 的按钮,并且在焦点结束时的焦点输出事件试图单击该按钮,以便解决它。像明智的我得到了解决方法。
另一种解决方案用户警报语句来解决它。