2012-10-27 45 views
4

即時有點卡在這裏。一些提示會非常好。
Asume我必須有一個多維的對象數組,這些對象包含我想在鼠標懸停(play,stop,showFrame等)上使用的函數。但他們並不是所有尚未加載,所以我的第一種方法是使用jQuery:將函數綁定到數組中的對象,避免關閉錯誤

.on("mouseover", function() { ... } 

,直到我遇到了一個閉合的問題,這是已經討論過幾次,這裏在計算器上和其他地方。首先,我嘗試着在另一個SO-thread上給出解決方案時遇到問題,直到遇到可以在.bind()中傳遞的eventData。的SO-封閉溶液我已經首先在下文評論的,活性的代碼包含我的方法與.bind EVENTDATA:

$(function(){ 
    for (var r=0, firDep=menu[0][0].length; r<firDep; r+=1){ 
     objects[0][0][r].init(); 
} 
for(var f=0, livLen=menu.length; f<livLen; f++){ 
    for(var g=0, livWid=menu[f].length; g<livWid; g++){ 
     for(var h=0, livDep=menu[f][g].length; h<livDep; h++){ 
      if(menu[f][g][h]){ 
//     (function() { 
//      var fr = f; 
//      var gr = g; 
//      var hr = h; 
// to apply this prior solution, i would simply replace all occurences of e.data.** with ** again and all .bind's with .on's 
        $('#'+menu[f][g][h]).bind("mouseover", { fr: f, gr: g, hr: h}, function(e) { 
         if(objects[e.data.fr][e.data.gr][e.data.hr].status==0){ 
          objects[e.data.fr][e.data.gr][e.data.hr].showFrame(1); 
         } 
        }); 
        $('#'+menu[f][g][h]).bind("mouseout", { fr: f, gr: g, hr: h}, function(e) { 
         if(objects[e.data.fr][e.data.gr][e.data.hr].status==0){ 
          objects[e.data.fr][e.data.gr][e.data.hr].showFrame(0); 
         } 
        }); 
        $('#'+menu[f][g][h]).bind("click", {fr: f, gr: g, hr: h}, function(e) { 
         e.preventDefault(); 
         if(objects[e.data.fr][e.data.gr][e.data.hr].status!=1 || objects[e.data.fr][e.data.gr][e.data.hr].status!=2){ 
          for(var t=0, tstLen=menu[e.data.fr][e.data.gr].length; t<tstLen; t++){ 
           if(objects[e.data.fr][e.data.gr][t].status==1 || objects[e.data.fr][e.data.gr][t].status==2){ 
            objects[e.data.fr][e.data.gr][t].stop(); 
            objects[e.data.fr][e.data.gr][t].playReverse(); 
           } 
          } 
          objects[e.data.fr][e.data.gr][e.data.hr].stop(); 
          objects[e.data.fr][e.data.gr][e.data.hr].play(); 
          finc = e.data.fr+1; 
          if(menu[finc][e.data.hr] && menu[finc][e.data.hr].length > 0){ 
           $('#menu'+finc).load('menu'+finc+e.data.hr+'.php', function() { 
            for(var b=0, ldLen=menu[finc][e.data.hr].length; b<ldLen; b++){ 
             objects[finc][e.data.hr][b].init(); 
            } 
            $('#menu'+finc).slideDown('slow'); 
           }); 
          } else { 
           if ($('#menu2').is(':visible')) { 
            $('#menu2').slideUp('slow', function() { 
             $('#menu1').slideUp('slow', function() { 
              $('#menu1').empty(); 
              $('#menu2').empty(); 
             }); 
            }); 
           } else if ($('#menu1').is(':visible')){ 
            $('#menu1').slideUp('slow', function() { 
             $('#menu1').empty(); 
            }); 
           } 
          } 
          loadContent(menu[e.data.fr][e.data.gr][e.data.hr]+".php"); 
         } 
        }); 
       //})(); //function execution for prior closure-defeating attempt 
      } 
     } 
    } 
    } 
}); 

所以我有3D陣列菜單[] [] [],定義結構, (),stop()等功能的對象[] [] []的三維數組,我有3個菜單div,#menu0,#menu1,#menu2將包含適當的深度'菜單。
基本上這兩種解決方案都可以工作,但只適用於從一開始就已經加載到頁面上的元素。例如鼠標懸停部分不觸發編後來的div是負載(),但很好的選擇

$('#'+menu[f][g][h]). 

匹配的替代解決方案,我發現這裏的話,你會刪除評論中開始得到這個匿名函數,用適當的**替換所有的e.data。**,用.on替換所有的.binds,當然還要刪除{fr:f,gr:g,hr:h } eventData部分。哦,並刪除最後的函數直接執行的註釋})();

任何暗示都會很棒,在此先感謝您的時間。

----編輯----

接受,這是一團糟。我會採取不同的方式,感謝您的幫助。然而,即使是更簡單的形式,邏輯問題依然存在,我真的對答案感興趣,只是爲了理解背後的基本邏輯問題。關於修補程序或on()我一點都不瞭解。 所以我用一個更簡單的例子在 jQuery: click function bind in for-loop with closure fix重新問這個問題。

+1

嗨卡爾。誠實地說,我不認爲代碼是可挽救的。如果你有機會得到它的工作,將來將無法維持。你可以用5-10行代碼實現你想要做的事情,沒有循環,沒有三維數組,也沒有重複。你可以發表一個新的問題,將你的問題陳述提煉成最簡單的形式,然後從這裏開始。 – david

回答

0

你的代碼看起來太複雜了 - 這是一個問題。我認爲你應該看看backbone.js或類似的框架來構建你的數據和邏輯與視圖。主幹(和下劃線)有一個非常有用的方法來處理集合和模型。

相關問題