在多个<script>块</script>中共享JS变量

时间:2011-04-25 17:40:12

标签: javascript ajax codeigniter variables

我正在开发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>块传递到另一个块的最快,最简单的方法是什么?由于构建应用程序的方式,我无法将这两个块放在一起。我应该为它写一个函数来获取并返回这些值(我应该怎么做?我是个新手)还是有更简单的方法?

非常感谢!

5 个答案:

答案 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_monthcurrent_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_monthcurrent_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
        });
    });
});