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”来解决这个问题?