我是javascript的新手所以请耐心等待我的要求是完全愚蠢的!
我正在尝试制作一个简单的模块。在模块内部,我想要一个包含模块设置的配置对象。我也在使用jquery。 jquery选择器仅在直接在主对象/模块中的函数中工作。
我知道javascript具有功能范围,所以我很惊讶我不能在模块内的任何地方使用jquery选择器。
编辑: 我希望能够使用jquery选择器直接在configs对象中设置我的所有配置。这样我就把所有杂乱的东西放在一个地方,然后可以访问configs.whatever整个模块的其余部分。目前,jquery选择器在configs模块中不起作用。
var OB = function() {
var configs = {
'mode' : 'test',
'numOfSelects' : $('.mySelect').find('select').length, // This doesnt work
}
var getMode = function() {
return configs.mode;
}
function init() {
alert(configs.numOfSelects); // This alerts 0 until the following line
alert($('.mySelect').find('select').length); // This correctly alerts 2
};
var handlers = {
successHandler : function() {
alert("Success");
},
errorHandler : function() {
alert("error");
}
}
return {
init : init,
getMode : getMode
}
}( );
$(document).ready(function(){
OB.init();
});
答案 0 :(得分:1)
编辑:有趣的是,我在下面的原始答案不正确,因为我在OB
的定义末尾没有注意到两个小括号,结果证明这些是罪魁祸首。您定义然后立即调用OB
,这是在DOM完全加载之前。删除这些括号并进行我在下面建议的更改。
调用OB()
会返回包含init
和getMode
的对象,但您尚未调用OB()
,而您只提到OB
。试试这个:
$(document).ready(function(){
OB().init();
});
另外,我假设你想稍后引用getMode。特别是,您将获得可以访问init()
调用有权访问的同一本地范围的getMode副本。为此,您需要存储调用OB()
的结果以供以后使用:
var ob;
$(document).ready(function(){
ob = OB();
ob.init();
});
function some_other_function() {
... ob.getMode() ...;
}
答案 1 :(得分:1)
并不是说jQuery不在范围内 - 这就是代码在您认为没有执行时。在执行匿名函数(config
)时定义变量var OB = function() {}()
。 DOM还没有准备好,因此DOM遍历找不到任何东西。当你在init()
中进行DOM遍历时,直到在$(document).ready()
处理程序中显式调用它才会执行,此时DOM就会被设置。这就是你所看到的不同。
答案 2 :(得分:1)
OB()
。因此,Marcelo的回答是OB()
方法中的ready()
。