Singleton模块&导入全局jQuery对象

时间:2011-10-14 14:13:37

标签: javascript jquery singleton

为了改进我编码的方式,我一直在阅读有关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


2 个答案:

答案 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")