2017-04-24 171 views
2

我试图选择一个收音机框,当我点击一个李。但是我得到错误“太多的递归”。jquery与“event.target”太多递归

$("li.user_line").click(function(event) { 
    if ($(event.target).is('li.user_line')) { 
    $(this).children("input[type=radio]").click(); 
    alert($("input[name=user_chk]").val()); 
    } 
}); 
+2

为什么使用'$(event.target).is('li.user_line')'?这个点击函数不会对'li.user_line'之外的其他元素有效,不需要检查。 – Oen44

+0

以下是@ Oen44写的(这是总体意义上的),你可以通过'.hasClass('className')'和'e.target.nodeName =='LI''检查一个元素是否有类。 –

回答

1

这是由于事件传播引起的。每当你点击你的li,您以编程方式单击input这是它的孩子,其传播的点击回其父li的点击,其子等

为什么不直接切换的检查,而不是点击?

$("li.user_line").click(function(event) { 
 
    $(this).children("input[type=radio]").each(function() { 
 
    $(this).prop('checked', !$(this).prop('checked')); 
 
    }); 
 
});
.user_line { 
 
    padding: 50px; 
 
    border: 1px solid #018bbc; 
 
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<li class="user_line"><input type="radio"></li> 
 
<li class="user_line"><input type="radio"></li> 
 
<li class="user_line"><input type="radio"></li> 
 
<li class="user_line"><input type="radio"></li>

+0

非常感谢你它的工作很多,但 当alert($(“input [name = user_chk]”)。val()); 给出相同的值 –

+0

仅供参考,您需要使用具有您的逻辑的'prop()',而不是'attr()',因为您无法在第三次和连续的点击中检查元素。另外请注意,如果你想要这种行为,你可以只使用一个复选框,而不用打扰任何JS –

+0

我忘了输入[name = user_chk]:现在检查它的工作正常 再次感谢 –

1

你得到的错误,因为input[type=radio]是点击的元素的一个孩子。点击该DOM冒泡的li,然后单击电台,然后再点击li,然后点击无线...

为了解决这个问题,你可以简单地电台的checked属性设置为true 。没有必要提高点击事件。

$("li.user_line").click(function(event) { 
 
    $(this).children("input[type=radio]").prop('checked', true); 
 
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<ul> 
 
    <li class="user_line"> 
 
    <input type="radio" /> 
 
    Click anywhere here to select the radio 
 
    </li> 
 
</ul>

注意,我删除冗余is()方法调用。由于您使用的jQuery选择器,结果将始终为true。另外请注意,您在此处创建的效果可以通过使用label元素的HTML单独实现。

+0

非常感谢它工作 –

+0

没问题。如果您发现它有帮助,请不要忘记接受答案 –