为了改进我编码的方式,我一直在阅读有关Singleton模块的内容。我认为我已经完全掌握了,但是我看到了一个将jquery导入为全局的示例,但是我无法引用如下的DOM元素:
var bnTalent = (function ($) {
var bnt = {},
privateVariable = 1;
domRef = $("#pie").val();
function privateMethod() {
// ...
}
bnt.moduleProperty = 1;
bnt.init = function () {
alert("bingo" + domRef);
//domRef.hide();
};
return bnt;
}(jQuery));
HTML:
<!DOCTYPE html>
<html>
<head>
<title>bnTalent</title>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.6.4/jquery.min.js"></script>
<script src="js/bnTalent.js"></script>
<link rel="stylesheet" href="css/main.css" type="text/css" media="screen" />
</head>
<body>
<input type="text" id="pie" value="mypies" />
</body>
</html>
请记住这段代码只是为了获得理解,我想知道为什么我无法从闭包中检索DOM元素的值。我是否错过了这一点,还是我犯了一些学校点错误?请注意元素存在于DOM中,并且在此模块之前加载了jQuery。这也不是尝试创建jQuery插件。
非常感谢任何帮助。
请注意我只是在dom加载后使用firebug来执行init方法。
* * GOT IT WORKING - 您好我在全局变量domRef前添加了var,这似乎解决了问题 - 有人可以解释原因吗? 此外,我似乎可以使用domRef声明var然而上面的变量需要为“1”我们生活并学习lol
答案 0 :(得分:1)
这有效:http://jsfiddle.net/J9PKB/你究竟无法做到什么?
修改强>
你没有在任何地方使用init
方法......,你是否希望自动接听电话?因为它不会。你必须自己打电话。
在包含JS文件后,在头标记上添加:
<script type="text/javascript">
$(document).ready(function() { bnTalent.init(); } );
</script>
请告诉我这是否有帮助!
答案 1 :(得分:1)
function bnTalentFactory($){
if(bnTalentFactory.bnt)
return bnTalentFactory.bnt;
if(arguments.length == 0 || arguments[0] != jQuery)
var $ = jQuery;
var bnt = {},
privateVariable = 1,
domRef;
function privateMethod() {
// ...
}
bnt.jqueryIsDefined = function(){
return $ === jQuery;
}
bnt.moduleProperty = 1;
bnt.init = function () {
domRef = $("#pie").val();
alert("bingo" + domRef);
//domRef.hide();
};
bnTalentFactory.bnt = bnt;
return bnt;
}
var bnTalent = bnTalentFactory();
var anotherBnTalent = bnTalentFactory();
alert(bnTalent === anotherBnTalent);// true => the same instance
alert(bnTalent.jqueryIsDefined());// true => jquery is defined inside this object, withouth even passing it to the factory
请注意,为了拥有有效的“domRef”,您需要在加载dom后执行此代码,以便在执行时存在$("#pie")
。