jQuery – 在函数之间共享变量
这应该相当简单; 我很确定我不理解它。
仅供参考,该网站使用jQuery在内容上运行ajax .load()。
在我的主父页面上,在标题中我有我的nav .load()jQuery代码: –
$(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点击使用。
调用此链接的锚点看起来像Settings
,我将其保存为522.因此,其他请求(没有projID,因为数据已被加载到DOM中以用于其他导航,并且他们不知道 projID。我希望这是有意义的。
所以,我想知道在前一次调用中已经使用了projID时,如何使用settings
等链接。
有什么想法吗?
好吧,具有讽刺意味的是,你已经在全局范围内保存了projID
(更好地说,在你的声明中不使用var
,在window object
中。
因此,一旦初始化,您就可以从代码中的任何位置访问projID
。
无论如何这不是一个好的实践,相反,这是一个非常糟糕的实践。
我能想到的最好的方法是创建自己的应用程序对象,在那里存储所有数据并从那里访问它。
var your_application = { var foo = 'bar', base = 'ball'; }; // your_application.foo = 'another bar';
使用闭包和函数式编程可以推动这个原理。 存储和保持数据本地而非全局(窗口)的更好的解决方案可能看起来像
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());
这是有条理的 javascript编程的想法。 那里有一些好书,我建议用Javascript: the good parts
开始Javascript: the good parts
道格拉斯克罗克福德Javascript: the good parts
。
另一个解决方案应该是jQuery .data()
方法,它能够将数据存储在全局哈希中。
// store $.data(document.body, 'projID', projID); // access var foo = $.data(document.body, 'projID'); // remove $.removeData(document.body, 'projID');
只需在js脚本的开头键入以下行 –
var projID;
只需在函数外部定义变量,它就会变为全局变量。
是使其成为全局变量。 添加var projID; 在开始脚本。 同意萨达特。
如果我理解正确,你有一个函数被应用为各种a.nav
元素的a.nav
.click()
处理程序,并且你希望projID
变量只需要设置一次并记住以后调用同一个函数。
这似乎是静态变量的完美用例。 静态变量将在函数调用之间保留其值,但仍在该函数范围内。 JavaScript本身没有显式静态变量,但您可以通过将变量定义为该函数的成员来模拟它们; 最终结果是一样的。 以下是该链接的代码:
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); }
我没有测试过它,但是下面的修改应该是这样的:
试试这个,我让你的代码更简单..
原型不是更好用吗?
如
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'));