我正在开发CodeIgniter应用程序。
我有一个视图,我们称之为Calendar,其中包含一个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>
块传递到另一个块的最快,最简单的方法是什么?由于构建应用程序的方式,我无法将这两个块放在一起。我应该为它写一个函数来获取并返回这些值(我应该怎么做?我是个新手)还是有更简单的方法?
非常感谢!
答案 0 :(得分: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的“好零件”。
答案 1 :(得分:13)
将变量声明为全局变量。只需将它们移出文档就绪功能。
var current_month = <?= $init['current_month']; ?>;
var current_year = <?= $init['current_year'] ?>;
$(document).ready(function() {
....
});
现在可以从任何脚本块访问 current_month
和current_year
。
答案 2 :(得分:3)
如果在任何功能块之外声明变量,它们将是全局变量,可供页面上的任何脚本使用。
var current_month;
var current_year;
$(document).ready(function () {
// init
current_month = <?= $init['current_month']; ?>;
current_year = <?= $init['current_year'] ?>;
...etc...
});
答案 3 :(得分:2)
“var”声明初始化就绪函数范围中的两个变量(current_month
,current_year
) - 因此它们在其他地方不可用。您可以在全球范围内声明它们:
var current_month;
var current_year;
$(document).ready(function() {
...
current_month = ...
}
这样你可以在底部脚本中使用它们。
答案 4 :(得分: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
});
});
});