2017-04-24 111 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

沒問題。如果您發現它有幫助,請不要忘記接受答案 –