jQuery - 在函数之间共享变量

时间:2010-07-08 07:31:28

标签: javascript jquery variables

这应该相当简单;我很确定我不理解它。

仅供参考,该网站正在使用jQuery在内容上运行ajax .load()。

在我的主父页面上,在标题中我有我的nav .load()jQuery代码: -

<script type="text/javascript" charset="utf-8">

    $(document).ready(function(){

        $('a.nav').click(function() {
            page = $(this).attr('page');
            projID= $(this).attr('projID');

            if($("#mainRight").is(":visible")) { $('#mainRight').hide(200); }

            switch(page) {

            case 'projSettings': $("#mainRight").load("content.php?load=" + page, { projID: projID}); break;
            case 'projMetrics': $("#mainRight").load("content.php?load=" + page, { projID: '5000227' }); break;
            case 'projTags': $("#mainRight").load("content.php?load=" + page, { projID: projID}); break;
            case 'projShare': $("#mainRight").load("content.php?load=" + page, { projID: '5000227' }); break;

            }
            $('#mainRight').show(300);

        });

现在,基本上我想让projID重新使用,以供其他不提供它的a.nav点击使用。

调用它的链接锚点看起来像<a page="projSettings" projID="522" class="nav">Settings</a>我想保存它522.所以,其他请求(没有projID,因为数据已加载到DOM中用于其他导航并且他们不知道 projID。我希望这是有道理的。

所以,我想知道在前一次调用中已经使用了projID时如何使用<a page="projSettings" class="nav">settings</a>之类的链接。

有什么想法吗?

8 个答案:

答案 0 :(得分:6)

讽刺的是,讽刺的是,您已经在全球范围内保存projID(更好地说,在您的声明中使用window object <{1>} 而非

因此,一旦初始化,您就可以从代码中的任何位置访问var

无论如何,这不是一个好的实践,相反,这是一个非常糟糕的实践。

我能想到的最好的方法是创建自己的应用程序对象,在那里存储所有数据并从那里访问它。

projID

使用闭包功能编程,您可以推广这个原则。存储和保持数据本地而不是全局(窗口)的更好的解决方案可能看起来像

var your_application = {
    var foo  = 'bar',
        base = 'ball';        
};

// your_application.foo = 'another bar';

这是有条不紊的 javascript编程的想法。那里有一些好书,我建议开始使用道格拉斯·克罗克福德的var your_application = function(){ var foo = 'bar', base = 'ball'; return { getfoo: function(){ return foo; }, setfoo: function(newfoo){ foo = newfoo; } }; }); var app = your_application(); app.setfoo('foobar!'); alert(app.getfoo());

另一个解决方案应该是jQuery Javascript: the good parts方法,它能够将数据存储在全局哈希中。

.data()

答案 1 :(得分:0)

只需在js脚本的开头键入以下行 -

var projID;

答案 2 :(得分:0)

只需在函数外部定义变量,它就会变为全局变量。

答案 3 :(得分:0)

是将其设为全局变量。 添加var projID;在脚本开始。 同意萨达特。

答案 4 :(得分:0)

如果我理解正确,你有一个函数被应用为各种.click()元素的a.nav处理程序,你希望projID变量只需要设置一次并记住未来对同一功能的召唤。

这似乎是静态变量的完美用例。静态变量将在函数调用之间保留其值,但仍在该函数范围内。 JavaScript本身没有显式静态变量,但您可以模拟它们by defining a variable as a member of that function;最终结果是一样的。以下是该链接的代码:

function countMyself() {
    // Check to see if the counter has been initialized
    if ( typeof countMyself.counter == 'undefined' ) {
        // It has not... perform the initilization
        countMyself.counter = 0;
    }

    // Do something stupid to indicate the value
    alert(++countMyself.counter);
}

答案 5 :(得分:0)

我没有对它进行过测试,但是应该进行以下修改:

<script type="text/javascript" charset="utf-8">
    var projID = null; // Better to have some default here

    $(document).ready(function(){

        $('a.nav').click(function() {
            var page = $(this).attr('page');
            projID= $(this).attr('projID') || projID;

            if($("#mainRight").is(":visible")) { $('#mainRight').hide(200); }

            switch(page) {

            case 'projSettings': $("#mainRight").load("content.php?load=" + page, { projID: projID}); break;
            case 'projMetrics': $("#mainRight").load("content.php?load=" + page, { projID: '5000227' }); break;
            case 'projTags': $("#mainRight").load("content.php?load=" + page, { projID: projID}); break;
            case 'projShare': $("#mainRight").load("content.php?load=" + page, { projID: '5000227' }); break;

            }
            $('#mainRight').show(300);

        });

答案 6 :(得分:0)

试试这个,我让你的代码更简单..

<script type="text/javascript" charset="utf-8">
    var projID; // making it global
    $(document).ready(function(){

        $('a.nav').click(function() {
            page = $(this).attr('page');
            projID= $(this).attr('projID');

            if($("#mainRight").is(":visible")) { $('#mainRight').hide(200); }                

            switch(page) {

            case 'projMetrics': projID = '5000227'; break;
            case 'projShare': projID: '5000227'; break;

            }

            $('#mainRight').load("content.php?load=" + page, { projID: projID}, function(){
                   $(this).show();
            });

        });
     })
</script>

答案 7 :(得分:0)

使用原型并不是更好吗?

,例如

function System()
{
    settings = {
       'Foo': 'Bar'
    }
}

//Then define a prototype
System.prototype.getSetting = function(key)
{
   return settings[key] || undefined;
}


System = new System();
alert(System.getSetting('Foo'));​