2011-04-25 36 views
13

我正在研究CodeIgniter應用程序。共享多個變量<script>中的JS變量

我有一個視圖,我們稱之爲日曆,其中有一個JS/jQuery <script>塊。看起來是這樣的:

$(document).ready(function() { 

     $("#day_list").fadeIn(600); 

     // init 
     var current_month = <?= $init['current_month']; ?>; 
     var current_year = <?= $init['current_year'] ?>; 

     // previous, next month ajax call 
     $(".previous, .next").click(function(event) { 
      // do stuff to these variables, then ajax call. 
      $.ajax({ 
       // ajax 
      }); 
     }); 
    }); 

另一種觀點認爲,我的頁腳,我有應該使用相同的變量(current_month和CURRENT_YEAR)另一個腳本塊。但是,它不知道它們的存在。將這些變量從第一個<script>塊傳遞給另一個的最快,最簡單的方法是什麼?由於我的應用程序構建方式,我無法將這兩個塊組合在一起。我應該爲它寫一個函數來獲取並返回這些值(我應該怎麼做?我是這樣的新手)還是有更簡單的方法?

非常感謝!

回答

15

學習在JavaScript中命名空間變量非常重要。範圍至關重要,而且事關重大。現在因爲你使用「var」關鍵字,你的東西將在本地範圍內。

這裏的一些其他答案說,你應該將它們移到全球範圍。這是有效的,除非有意無意地覆蓋它們。我非常不同意這種方法,全局範圍的變量在JavaScript中是不好的做法。

命名空間是這樣的:

var foo = foo || {} //Use existing foo or create an empty object. 
foo.bar = foo.bar || {} 
foo.bar.baz = foo.bar.baz || {} 

等等,等等

這看起來好像多了很多的工作,但它也可以保護你的變量。

您還可以添加一個簡單的命名空間函數,該函數可以安全地命名空間與窗口對象的所有內容。(我從幾年前的某個地方就把它拆了,我想我修改了一下,但可能沒有修改)。

在您的應用程序的頂部將這個你可以命名空間$ .namespace( 「myapp.mydata」)的東西,然後說myapp.mydata.currentYear = ...

$.namespace = function() { 
    var a=arguments, o=null, i, j, d; 
    for (i=0; i<a.length; i=i+1) { 
     d=a[i].split("."); 
     o=window; 
     for (j=0; j<d.length; j=j+1) { 
      o[d[j]]=o[d[j]] || {}; 
      o=o[d[j]]; 
     } 
    } 
    return o; 
}; 

而且,如果你是新的,或想獲得硬核,我建議閱讀Crockford的JavaScript Good Part。

+0

謝謝。一旦我圍繞這個概念,我一定會嘗試這個。謝謝你推薦這本書。我一直想拿起一本書,但其中有這麼多,哈哈。謝謝! – cabaret 2011-04-25 17:57:41

+0

沒有問題。好的部分被許多人認爲是JavaScript語言的權威書籍。 – JSager 2011-04-25 17:59:54

13

聲明變量爲全局變量。只需將它們移動到文檔就緒功能之外即可。

var current_month = <?= $init['current_month']; ?>; 
var current_year = <?= $init['current_year'] ?>; 

$(document).ready(function() { 
.... 
}); 

current_monthcurrent_year現在可以從任何腳本塊訪問。

+0

謝謝,謝謝! – cabaret 2011-04-25 17:45:54

+0

啊....很好,謝謝。還必須將它移到(function($){})(jQuery)之外;包裝。 – Andrew 2017-04-27 12:53:43

3

如果您在任何功能塊之外聲明變量,它們將是全局變量,可供頁面上的任何腳本使用。

var current_month; 
var current_year; 

$(document).ready(function() { 

    // init 
    current_month = <?= $init['current_month']; ?>; 
    current_year = <?= $init['current_year'] ?>; 

    ...etc... 

}); 
1

由於你var聲明這些變量在一個函數內部,它們有局部範圍。外移動它們,使它們的全球:

// init 
var current_month = <?= $init['current_month']; ?>; 
var current_year = <?= $init['current_year'] ?>; 

$(document).ready(function() { 

    $("#day_list").fadeIn(600); 

    // previous, next month ajax call 
    $(".previous, .next").click(function(event) { 
     // do stuff to these variables, then ajax call. 
     $.ajax({ 
      // ajax 
     }); 
    }); 
}); 

不必全局變量是它們語義存儲在你的HTML,然後檢索他們通過jQuery的更好的解決方案:

<body data-month="<?= $init['current_month']; ?>" data-year="<?= $init['current_year'] ?>"> 

$(document).ready(function() { 
    $("#day_list").fadeIn(600); 

    var current_month = $("body").data("month"); 
    var current_year = $("body").data("year"); 

    // previous, next month ajax call 
    $(".previous, .next").click(function(event) { 
     // do stuff to these variables, then ajax call. 
     $.ajax({ 
      // ajax 
     }); 
    }); 
}); 
+0

一位主要是網頁設計師的前端開發人員,總是很想做到這一點,將您的JS變量存放在HTML中供以後檢索,但它真的是一個好的可維護解決方案嗎? – 2016-08-18 07:09:01

3

的「VAR」聲明初始化準備功能範圍內的兩個變量(current_month,current_year) - 因此它們在別處不可用。您可以在全局聲明它們:

var current_month; 
var current_year; 
$(document).ready(function() { 
    ... 
    current_month = ... 
} 

這樣,您可以在底部腳本中使用它們。