2012-12-05 55 views
1

我得到的錯誤信息太多的遞歸。爲什麼?錶行jquery拋出的錯誤信息太多遞歸

following code is應該在點擊圖像時展開/摺疊表格行。如果圖像不存在,點擊後最後一行將展開/摺疊,會出現一個div

$(document).ready(function() { 
    $(".ui-dialog-titlebar").hide(); 
    //$(".lvlcollapse .level4").hide(); 
    $("tr.lvlcollapse").click(function() { 
     //alert($(this).find("img").attr("src")); 
     if ($(this).find("img").attr("src") != undefined) { 
      var tnow = $.now(); 
      var allClass = $(this).attr('class'); 
      var level = getLevel($(this)); 
      var state = getClass($(this), '^clicked\\d+$'); 
      if (state == undefined) { 
       state = "closing"; 
       $(this).addClass("clicked" + tnow); 
      } 
      else { 
       $(this).removeClass(state); 
       tnow = state.substr(6); 
      } 
      switchImage($(this)); 
      $(this).nextAll(".lvlcollapse").each(function() { 
       var sublvl = getLevel($(this)); 
       var subtnow = 0; 
       var substate = getClass($(this), '^closed\\d+$'); 
       if (substate != undefined) subtnow = substate.substr(5); 
       if (sublvl > level) { 
        if (state == "closing" && subtnow == 0) { 
         $(this).addClass("closed" + tnow); 
         $(this).toggle(); 
        } 
        else if (subtnow == tnow) { 
         $(this).removeClass(substate); 
         $(this).toggle(); 
        } 
       } 
       else { 
        return false; 
       } 
      }); 

     } else { 
      //alert('No Image '); 
      $(".button").click(function(event) { 
       //var $this2 = $(this); 
       var allLevel4 = $(this).next(".lvlcollapse.level4"); 
       $($(this)).toggle('fast', function() { 
        if (allLevel4.is(":visible")) { 
         $(this).html("Show Attempts"); 
         alert('hello2'); 
         return false; 
        } else { 
         $(this).html("Hide Attempts"); 
         alert('hello3'); 
         return false; 
        } 

       }) event.preventDefault(); 
      }).trigger("click"); 
     } 
    }); 
    $(".lvlcollapse.level2").filter(function() { 
     return $(this).next(".lvlcollapse.level3").is(":visible"); 
    }).trigger("click"); 
    //$(".button").filter(function() { return $(this).next(".lvlcollapse.level4").is(":visible"); }).hide(); 
});​ 
+0

你應該創建一個http://jsfiddle.net/給我們看問題,明白你正在嘗試做。 –

+0

不再有「太多遞歸」的消息,請參閱我的答案下的評論,這應該被關閉,並且應該提出一個新問題。 –

回答

0

看起來很有趣的一件事是,您要在點擊處理程序中爲點擊處理程序添加一個點擊處理程序,以便使用tr.lvlcollapse。這將創建一個新的處理程序,每次你點擊它,它會觸發所有以前的處理程序,當你打電話trigger.click()

由於點擊事件泡沫,它也將觸發所有父母的點擊處理程序。如果按鈕在tr.lvlcollapse之內,那可能是你的問題。

兩件事情你需要做的:

  • 不要從處理程序中,除非你真的知道自己在做什麼,設置處理程序和你有一個計劃,以取消綁定處理程序,或者至少是,綁定前刪除現有綁定。請注意,這不常見,您通常不會在處理程序中添加處理程序。

  • 呼叫event.stopPropagation()如果你不想祖先節點處理click

+0

我將如何解除綁定tr.lvlcollapse點擊事件 – user1880192

+0

'$( 「tr.lvlcollapse」)。關閉( 'click')'但是這會刪除所有的處理程序,使用命名空間事件設置事件會更安全,所以您不會刪除所有處理程序。我不知道這是正確的事情,沒有一個例子來看,幾乎不可能建議更直接的東西http://docs.jquery.com/Namespaced_Events –

+0

以及刪除按鈕單擊ouside,它的作品部分。但是,而不是躲在下一行帶班級別4它隱藏按鈕本身$( 「按鈕」。)點擊(函數(事件){ \t \t \t \t \t \t //變量$ this2 = $(本); \t \t \t \t \t \t變種allLevel4 = $(本)的.next(」 lvlcollapse.level4" 。);。 \t \t \t \t \t \t $($(本))切換( '快',函數(){ \t \t \t \t \t \t \t如果(allLevel4.is( 「:可見」)){ \t \t \t \t \t \t \t \t $( 「按鈕 」)HTML(「 顯示嘗試」); \t \t \t \t \t \t \t \t返回FALSE; \t \t \t \t \t \t \t}其他{ \t \t \t \t \t \t \t \t $( 「按鈕 」)HTML(「 隱藏嘗試」)。 \t \t \t \t \t \t \t \t返回FALSE; \t \t \t \t \t \t \t} \t \t \t \t \t \t}) event.stopPropagation(); \t \t \t \t \t}); – user1880192

0

這些警報會發生什麼?如果你取消註釋他們,你會看到他們一遍又一遍地重複嗎? else中的$('。button')。click()看起來很糟糕。您只需要註冊一次,但是您已將其添加到點擊監聽器中,以便每次用戶單擊鏈接時都會進行註冊。將其拉出並在文檔準備就緒或桌子建立時註冊。不響應用戶點擊的東西。

+0

我的表看起來像這樣<表邊界= 「1」> ​​1 ​​2 ​​

click Here
< TR類= 「lvlcollapse級別4」>​​4 ​​1 ​​2 ​​
click Here
​​4 – user1880192