2016-01-23 78 views
0

這裏是代碼,我在函數內部有一個菜單全局變量。我想用它外面,但後來我得到一個「未定義的引用錯誤...· 這是唯一的javascript代碼我有,所以有與其他變量或函數的干涉。提前javascript中的全局變量無法正常工作

感謝。

$(function() { 
    menu = $('nav#menu').mmenu(
    { 
     navbars: [ 
     { 
      position: "top", 
      height : 1, 
      content : [ 
      '<a href="#/" class="fa fa-phone"></a>', 
      '<img src="imagenes/wheel32.png" /><p class="navbartxt">bicimap.uy</p>',      
      ] 
     }, 
     { 
      position: "bottom", 
      content: [ 
      '<a class="fa fa-envelope"></a>', 
      '<a class="fa fa-twitter"></a>', 
      '<a class="fa fa-facebook"></a>' 
      ] 
     } 
     ],      
     extensions: ["multiline"],  
     onClick: { 
     close: false 
     }, 
     navbar:{ 
     title: "Inicio"      
     }, 
     offCanvas: {   
     zposition : "next" 
     } 
    });   
    }); 

我需要把這個函數裏面得到它的工作

var API = $("#menu").data("mmenu"); 

menu.on('click', 'a[class^="fa fa-twitter"]', function() { 
    $('#twitter').show();     
    var API = $("#menu").data("mmenu"); 
    API.close();  

    return false; 
}); 
+0

你在哪裏聲明'menu'? – Xufox

+0

在函數內,在全局變量中 – rossig7

+0

將你的代碼的第二部分移動到ready函數'$(...);'這種方式菜單將在你調用它的時候被定義。 – Ibu

回答

1

我缺少一些背景這裏(我假設有更多的,我們沒有看到?)

但是在$(…)裏面的代碼已經運行之前,你可能正在執行後面的代碼片段menu.on('click'…;所以menu將是未定義的。

如果您剛開始使用,那麼值得瀏覽一下您的瀏覽器的開發人員工具並瞭解中斷點和日誌記錄。

您需要確保在設置後才能使用menu,可能是因爲您的所有調用都已準備就緒。


執行順序

  1. $被調用,功能是作爲第一個也是唯一一個參數。函數本身不被調用。

  2. API$("#menu"的結果定義)根據您添加此腳本的html文件的位置,可能找不到,也可能找不到。

  3. data方法,重要的是

  4. 你嘗試調用onmenu,這仍然是不確定的

  5. 晚些時候的結果調用,你傳遞給$函數被調用,菜單結束被定義,以便後期變得有用

+0

事實上,正如我所說的,沒有比HTML更多的代碼,這是唯一的JavaScript代碼片段。 感謝這就是我所害怕的:它可能在菜單被加載之前執行。 – rossig7

+0

沒有什麼可怕的,只是延遲調用期望'menu'被定義的代碼,直到在DOM準備好之後運行的函數中定義它爲止。如果您不瞭解執行順序,我會添加一個快速註釋。 – mczepiel

+0

作爲一個澄清的說明:由於沒有實際的'var'聲明,它不僅僅是_value_菜單,它將不會被定義,根本不會有懸掛的聲明,並且不會存在對'menu'的引用;因此爲什麼你得到一個_「未定義的引用」_錯誤,而不是_「嘗試訪問未定義的屬性_錯誤。在全局範圍內應該有一個'var menu;'的聲明,以便提升聲明。 –

0

如果你的關閉/匿名函數發生了異步地執行,其餘的代碼的計算時間可能還沒完成。我需要更多的上下文來確定。

+0

的同一個函數中的問題。如果您不使用'var',JavaScript將隱式創建全局變量。儘管如此,這是令人不悅的,而且許多錯誤的來源。 – mczepiel

+0

因爲我提出了最佳做法,我是否因此而陷入低谷? – Cody

+0

對不起,「變量是全局的」,是不正確的。但是,是的,你說這是個好主意。您最近添加的異步實際上解決了問題,但是,upvoting。 – mczepiel

0

這是我找到的解決方案,也許它不是最好的,因爲它可能帶來問題。由於某些原因,就緒功能不能如上所示,也許一些資產正在被預期。

menu = null; 
$(function() { 

      menu = $('nav#menu').mmenu(

      { 
       navbars  : [{ 
        position: "top",  
        height : 1, 
        content : [ 

         '<img src="imagenes/wheel32.png" /><p class="navbartxt">bicimap.uy</p>',     

        ] 
       }, 
       { 
        position: "bottom", 
        content: [ 
         '<a class="fa fa-envelope"></a>', 
         '<a class="fa fa-twitter"></a>', 
         '<a class="fa fa-facebook"></a>' 
        ] 
       } 
       ],     
       extensions: ["multiline"], 
       onClick: { 
        close: false 
       }, 
       navbar:{ 
        title: "Inicio"      
       }, 
       offCanvas: { 
        zposition : "next" 
       } 

     }); 

    }); 


$(window).load(function() { 

    var API = $("#menu").data("mmenu"); 

     menu.on('click', 'a[class^="fa fa-twitter"]', function() { 
         $('#twitter').show(); 

          var API = $("#menu").data("mmenu"); 
          API.close();  

         return false; 
        } 
     ); 

});