簡體   English   中英

JQuery 1.3.2中的“過多遞歸”錯誤

[英]“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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM