这应该相当简单;我很确定我不理解它。
仅供参考,该网站正在使用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>
之类的链接。
有什么想法吗?
答案 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'));