[英]“too much recursion” error in JQuery 1.3.2
我試圖制作一個具有一些動態行為的表單。 具體來說,我在div中輸入了輸入,我希望當用戶點擊div中的任意位置時,輸入就會被選中。 我使用的是JQuery 1.2.6,一切正常。
但是,我升級到JQuery 1.3.2並且我得到了一些奇怪的行為。 當我點擊任何輸入時,我會在選擇之前得到延遲。 我的Firefox錯誤控制台在JQuery庫中給了我幾個“太多的遞歸”錯誤。 我在Internet Explorer 7中嘗試了該頁面並收到錯誤消息“對象不支持此屬性或方法”。
我做錯了什么,或者這是JQuery中的錯誤? 有沒有人知道一種方法來修復這種行為,而不回到舊版本? 我正在使用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() {
var radio = $(this).children("input")[0];
radio.checked = !radio.checked;
});
});
ya,點擊事件冒泡...所以當你舉起$(this).children("input").click()
,你正在籌集$(".question div").click()
再次$(".question div").click()
,依此類推。
如果您已經使用<label for="">
為什么還需要這樣做? 點擊標簽應該激活無線電控制。
[編輯:]跟進你的評論,你可以這樣做:
使標簽顯示為塊元素,應用您用於包裹字段的div的所有樣式。
.question label { display:block }
然后使用此布局。 如果div也可以擺脫。
<label><input type="radio">Coke</label>
<label><input type="radio">Pepsi</label>
當我要讓我的div提交它的孩子輸入時,我遇到了同樣的問題:提交。 這將解決問題:
$(function() {
$(".question div").click(function() {
$(this).children("input").click(function(event){
event.stopPropagation();
});
$(this).children("input").trigger("click");
});});
當事件的目標是div時,只觸發click()
,即
$(function() {
$(".question div").click(function(event) {
if($(event.target).is('div'))
$(this).children("input").click();
});
});
<script type="text/javascript">
$(function() {
$(".question div").click(function() {
$(this).find("input").attr("checked", "checked");
});
});
</script>
PS:它反復過多可能是因為你停止了div的點擊傳播,而不是輸入點擊。
問題(正如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方法,但我想它超出了你的問題的范圍。
問候,馬諾洛
我不記得如何使用jQuery檢查無線電,但可能是這樣的:
<script type="text/javascript"> $(function() { $(".question div").click(function() { $(this).children("input").checked(true); // or $(this).children("input").checked= true; }); }); </script>
我知道這可能不是答案,但我正在寫它,因為它發生在我之前:當我在同一個項目中使用jquery和prototype時,它給了我“太多的遞歸”錯誤,這也可能發生在ajax上.net with jquery,因此如果您使用多個庫,請確保庫之間沒有沖突。
謝謝你們。 我嘗試了grillix設置checked屬性的想法,雖然我不得不修改一下語法。 這是我做的:
$(this).children("input").attr("checked", true);
它有效,但我仍然很好奇為什么我以前的方式停止使用JQuery 1.3.2。 我知道事件冒泡行為的變化,但為什么我不能通過在回調中調用“event.stopPropagation()”或“return false”來解決這個問題?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.