Javascript &引用;“递归太多”;JQuery 1.3.2中的错误

Javascript &引用;“递归太多”;JQuery 1.3.2中的错误,javascript,jquery,Javascript,Jquery,我正在尝试创建一个具有动态行为的表单。具体地说,我在div中有我的输入,我希望这样,当用户单击div中的任意位置时,输入被选中。我使用的是jQuery1.2.6,一切正常 然而,我升级到了JQuery 1.3.2,出现了一些奇怪的行为。当我点击任何一个输入时,我会在选择它之前得到一个延迟。我的Firefox错误控制台在JQuery库中给了我几个“太多递归”错误。我在InternetExplorer7中尝试了该页面,但出现了一个错误,显示“对象不支持此属性或方法” 我是做错了什么,还是这是JQue

我正在尝试创建一个具有动态行为的表单。具体地说,我在div中有我的输入,我希望这样,当用户单击div中的任意位置时,输入被选中。我使用的是jQuery1.2.6,一切正常

然而,我升级到了JQuery 1.3.2,出现了一些奇怪的行为。当我点击任何一个输入时,我会在选择它之前得到一个延迟。我的Firefox错误控制台在JQuery库中给了我几个“太多递归”错误。我在InternetExplorer7中尝试了该页面,但出现了一个错误,显示“对象不支持此属性或方法”

我是做错了什么,还是这是JQuery中的一个bug?有人知道一种方法来修复这种行为,而不必回到旧版本吗?我正在使用Firefox 3.0.7,以防万一。下面是一个简单的例子来说明这个问题:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html><head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>quiz test</title>
<script type="text/javascript" src="jquery-1.3.2.min.js"></script>
</head>
<body>
<div class='question'>Favorite soda?
    <div><input type='radio' name='q' value='A' id='a'><label for='a'>Coke</label></div>
    <div><input type='radio' name='q' value='B' id='b'><label for='b'>Pepsi</label></div>
    </div>
<script type="text/javascript">
$(function() {
    $(".question div").click(function() {
        $(this).children("input").click();
    });
});
</script>
</body></html>
$(function() {
    $(".question div").click(function() {
        $(this).children("input").click(function(event){
            event.stopPropagation();
        });
        $(this).children("input").trigger("click");
    });});

测验
你最喜欢的汽水?
焦炭
百事可乐
$(函数(){
$(“.question div”)。单击(函数(){
$(this).children(“输入”)。单击();
});
});

ya,单击事件气泡…因此,当您筹集
$(此)。子项(“输入”)。单击()
,您正在筹集
$(“.question div”)。再次单击()
,依此类推。

如果您已经在使用
,为什么需要这样做?无论如何,点击标签应激活无线电控制

[编辑:根据您的评论,您可以这样做:

使标签显示为块元素,应用用于包装字段的div的所有样式

.question label { display:block }
然后使用这个布局。你可以摆脱如果div太多

<label><input type="radio">Coke</label>
<label><input type="radio">Pepsi</label>
焦炭
百事可乐

我不记得如何使用jQuery检查收音机,但可能是这样的:

<script type="text/javascript"> $(function() { $(".question div").click(function() { $(this).children("input").checked(true); // or $(this).children("input").checked= true; }); }); </script>
$(function() {
    $(".question div").click(function(event) {
        $(this).children("input").click();
        event.stopPropagation();
    });
});
$(函数(){ $(“.question div”)。单击(函数(){ $(this).children(“输入”)。选中(true); //或 $(this).children(“输入”).checked=true; }); });
我知道这可能根本不是答案,但我写这封信是因为它发生在我身上: 当我在同一个项目中使用jquery和prototype时,它给了我“太多递归”错误,这也可能发生在带有jquery的ajax.net上,因此,如果您使用多个库,请确保库之间没有冲突。

当事件的目标是div时,仅触发
click()

$(function() {
    $(".question div").click(function(event) {
        if($(event.target).is('div'))
            $(this).children("input").click();
    });
});

谢谢大家。我尝试了grillix设置checked属性的想法,尽管我不得不稍微修改一下语法。以下是我所做的:

$(this).children("input").attr("checked", true);
它可以工作,但我仍然很好奇为什么我以前的方法停止使用jQuery1.3.2。我知道事件冒泡行为的变化,但是为什么我不能通过在回调中调用“event.stopPropagation()”或“return false”来解决这个问题呢?

问题(正如grilix所说)是事件“冒泡”DOM,因此,有一个简单的解决方案,您只需要取消冒泡效应

气泡是指(通俗地说)由于其在文档中的位置而在所有受影响的元素上触发的事件。因此,在您的示例中,“click”事件由BODY接收(按此顺序),然后由父(.question)DIV接收,然后由另一个DIV接收,最后由输入接收

要取消冒泡,可以通过调用回调函数中的stopPropagation方法来执行jQuery,如下所示:

<script type="text/javascript"> $(function() { $(".question div").click(function() { $(this).children("input").checked(true); // or $(this).children("input").checked= true; }); }); </script>
$(function() {
    $(".question div").click(function(event) {
        $(this).children("input").click();
        event.stopPropagation();
    });
});
简单的javascript方法要求您使用cancelBubble方法,但我猜这超出了您的问题范围

您好, Manolo


$(函数(){
$(“.question div”)。单击(函数(){
$(this.find(“input”).attr(“checked”、“checked”);
});
});

PS:可能是因为你停止了div的点击,而不是输入的点击。当我要让div提交它的子输入:submit时,我遇到了同样的问题。这将解决问题:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html><head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>quiz test</title>
<script type="text/javascript" src="jquery-1.3.2.min.js"></script>
</head>
<body>
<div class='question'>Favorite soda?
    <div><input type='radio' name='q' value='A' id='a'><label for='a'>Coke</label></div>
    <div><input type='radio' name='q' value='B' id='b'><label for='b'>Pepsi</label></div>
    </div>
<script type="text/javascript">
$(function() {
    $(".question div").click(function() {
        $(this).children("input").click();
    });
});
</script>
</body></html>
$(function() {
    $(".question div").click(function() {
        $(this).children("input").click(function(event){
            event.stopPropagation();
        });
        $(this).children("input").trigger("click");
    });});

我实际上是把它作为更复杂布局的一部分。标签并没有占据整个div,我不能单独使用标签,我希望在用户单击div中的任何位置时可以选择输入。我尝试制作标签块,但没有达到我想要的效果。如果我玩弄CSS,我可能会修复它,但是我想知道是否有一种快速的方法可以让它像以前一样工作,但是使用新版本的JQuery。+1:这是解决它的正确方法。不要重新发明轮子。。。主要的优点是,即使没有javascript,它也可以工作!处理CSS比处理“不必要的”javascript问题更有价值。如果它和以前不完全一样,那么您可能需要修改CSS规则,或者重新排列它们。您应该将Chetan答案标记为解决方案。顺便说一句,这也适用于JQuery的更新版本。感谢您的快速响应。我尝试过使用focus()但没有得到错误,但是在div中单击不再像单击()那样选择输入。你是什么意思?有什么区别吗?对不起,我没有注意到单选按钮的位置。我认为问题与新的冒泡行为有关。但是,我尝试在处理程序中调用event.stopPropagation(),我遇到了同样的问题。我还尝试了返回false,但仍然存在问题。在backticks或
后面包装内联代码。我已经修好了。你有个好主意,虽然你的语法有点不对劲。我试过这个,它成功了$(function(){$(“.question div”)。单击(function(){$(this.children(“input”).attr(“checked”,true);});});谢谢。我说,我不记得XD:)@mikez302:当您调用stopPropagation()时,事件已经冒泡到div;您必须向按钮和标签添加onclick处理程序,并在那里停止传播;另外,retrning false相当于prevent default(),而不是stopPropagation():您的解决方案可以使用单选按钮,但对于checkbox将失败谢谢。这个新的行为