JQuery 1.3.2中的“过多递归”错误
我正在尝试制作一个具有一些动态行为的表单。 具体来说,我有div的输入,我想这样做,当用户点击div中的任何地方时,输入被选中。 我使用的是JQuery 1.2.6,一切正常。
但是,我升级到JQuery 1.3.2并且我得到了一些奇怪的行为。 当我点击任何输入时,我会在选择之前得到延迟。 我的Firefox错误控制台在JQuery库中给了我几个“太多的递归”错误。 我在Internet Explorer 7中尝试了该页面并收到错误消息“对象不支持此属性或方法”。
我做错了什么,或者这是JQuery中的错误? 有没有人知道一种方法来解决这个问题,而不回到旧版本? 我正在使用Firefox 3.0.7以防万一。 这是我用来说明问题的一个简单示例:
quiz test Favorite soda? $(function() { $(".question div").click(function() { $(this).children("input").click(); }); });
$(function() { $(".question div").click(function() { var radio = $(this).children("input")[0]; radio.checked = !radio.checked; }); });
ya,点击事件冒泡…所以当你举起$(this).children("input").click()
,你正在筹集$(".question div").click()
再次$(".question div").click()
,依此类推。
如果您已经使用为什么还需要这样做? 点击标签应该激活无线电控制。
[编辑:]跟进你的评论,你可以这样做:
使标签显示为块元素,应用您用于包裹字段的div的所有样式。
.question label { display:block }
然后使用此布局。 你也可以摆脱div。
当事件的目标是div时,只触发click()
,即
$(function() { $(".question div").click(function(event) { if($(event.target).is('div')) $(this).children("input").click(); }); });
当我要让我的div提交它的孩子输入时,我遇到了同样的问题:提交。 这将解决问题:
$(function() { $(".question div").click(function() { $(this).children("input").click(function(event){ event.stopPropagation(); }); $(this).children("input").trigger("click"); });});
问题(正如grilix所说)是“冒泡”DOM的事件,所以,有一个简单的解决方案,你只需要取消泡泡效果。
Bubble指的是(普通英语)由于它在文档中的位置而被影响的所有元素被触发的事件。 因此,在您的示例中,“click”事件由(按此顺序)接收BODY,然后是父(.question)DIV,然后是另一个DIV,最后是INPUT。
要做泡泡取消,你可以通过在回调函数中调用stopPropagation方法来实现jQuery方式,如下所示:
$(function() { $(".question div").click(function(event) { $(this).children("input").click(); event.stopPropagation(); }); });
普通的javascript方式需要你使用cancelBubble方法,但我想它超出了你的问题的范围。
问候,马诺洛
PS:它的反复过多可能是因为你停止了div的点击传播,而不是输入的点击。
我不记得如何使用jQuery检查无线电,但可能是这样的:
我知道这可能根本不是答案,但我正在写它,因为它发生在我之前:当我在同一个项目中使用jquery和prototype时,它给了我“太多的递归”错误,这也可能发生在ajax上.net与jquery,因此如果您使用多个库,请确保库之间没有冲突。
谢谢你们。 我尝试了grillix设置checked属性的想法,尽管我必须稍微修改一下语法。 这是我做的:
$(this).children("input").attr("checked", true);
它有效,但我仍然很好奇为什么我以前的方式停止使用JQuery 1.3.2。 我知道事件冒泡行为的变化,但为什么我不能通过在回调中调用“event.stopPropagation()”或“return false”来解决这个问题?