2012-07-25 15 views
0

我正在研究這個菜單系統,它與操作系統如何操作非常相似。 使用jquery等Javascript怪異 - 我無能爲力

我有2條評論在For循環。它基本上輸出$(document).on('click')...函數中的最後一個索引。但在document.on之外,它工作正常。

這可能只是一個明顯的問題,但我已經花了大約一個小時在此..在此先感謝!

menu: function(title) { 
     this.title = title; 
     this.slug = slugify(title); 
     this.icon = false; 
     this.buttons = Object(); 
     this.num_buttons = 0; 
     this.visible = false; 
     this.timeout_id = null; 
     this.is_hovering_dropdown = false; 
     this.is_hovering_menu = false; 


     this.render = function() { 
      var that = this; 
      var slug = that.slug; 
      var str = '<li id="menu-' +slug +'"><a href="#" id="menu-toggle-' +slug + '">' + this.title + '</a>'; 

      if (this.num_buttons > 0) { 
       str += '<ul id="menu-dropdown-' + slug + '" style="display: none;" class="dropdown">'; 
       for (var button in this.buttons) { 

        str += '<li><a href="#" id="menu-dropdown-' + slug + '-' +that.buttons[button]['slug'] +'">' +that.buttons[button]['title'] +'</a></li>' 

        alert(button) //new project, open project, save as etc. 
        $(document).on("click", "#menu-dropdown-" +slug + '-' + that.buttons[button]['slug'], function() { 
         $("#menu-dropdown-" + slug).hide("fade", 200); 
         that.visible = false; 

         alert(button);//save as, save as, save as, save as etc. 
        }); 
       } 
      } 
     } 
    } 
+0

你有snipet你的html嗎? – webdad3 2012-07-25 21:41:00

+0

您是否在調用menu.render之前等待DOM加載? – Kasapo 2012-07-25 21:42:28

+0

在JavaScript中ew html concat。你應該使用像JsRender這樣的模板引擎,並保持你的理智! – 2012-07-25 21:43:14

回答

1

在這裏你去:

由於操作的順序,和範圍,所有的按鈕都被保存到buttonLAST價值的參考。

你想要做的就是把這個賦值放到一個立即調用的函數中,並將按鈕傳遞給那個特定的函數範圍。 (函數(button){$(document)。// ......}(button));}};眼前的函數內

一切都應該仍然有速功能的範圍之外訪問靜態的東西(即:that),它也必須的button當前值的參考,因爲它在那裏和那裏被調用。

故事的更長的版本是,你的按鈕,當創建被賦予了參考button,而不是button,因此,當他們實際上是在以後的調用時間,它們會參照當前存在的按鈕的值(即:它在循環中分配的最後一個值)。

+0

這就是我想的,但我不知道如何整理出來自我調用功能eh。非常感謝:) – 2012-07-25 21:54:18

+0

不用擔心,需要注意兩點:1)立即調用(/自調用)函數非常適合創建私有屬性:var public_obj =(function(){var private_var = 23,private_func = function(num){return private_var + num;},public_method = function(num ){return private_func(num);},public_api = {add_num:public_method}; return public_api;}());'所有的私人東西都是防篡改的。即使界面被破壞,它的內部也不會受到影響。 2)如果它是一個賦值,你可以用'= func(){}()'如果沒有賦值, – Norguard 2012-07-25 22:07:23