从jquery.ready()调用Javascript命名空间init

时间:2010-04-02 17:33:59

标签: javascript namespaces

以下方法在Javascript中声明命名空间的方法是否错误?它来自我正在阅读的书,似乎在我的代码中不起作用。

<script type="text/javascript">
var mynamespace = {};

if(Drupal.jsEnabled){       
    $(document).ready(mynamespace.init);    
}

mynamespace.init = function() {
    $("#mybutton").bind("click",function(){     
        alert('hello');
    });
}

</script>

5 个答案:

答案 0 :(得分:2)

看起来您的代码依赖于jQuery。确保在运行此脚本之前已加载。另外,在调用函数之前定义它。试试这个:

var mynamespace = {};

mynamespace.init = function() {
    $("#mybutton").bind("click",function(){     
        alert('hello');
    });
}

if(Drupal.jsEnabled){       
    $(document).ready(mynamespace.init);    
}

答案 1 :(得分:1)

这里似乎出现的问题是mynamespace.init函数在你将它连接到$(document).ready时没有定义。

这应该按预期工作:

<script type="text/javascript">
var mynamespace = {};

mynamespace.init = function() {
    $("#mybutton").bind("click",function(){     
        alert('hello');
    });
}

if(Drupal.jsEnabled){       
    $(document).ready(mynamespace.init);    
}

</script>

您也可以考虑将其形成为这样,因为它更容易理解(至少对我而言)

<script type="text/javascript">
var mynamespace = {
    init : function() {
        $("#mybutton").bind("click",function(){     
            alert('hello');
        })
};

if(Drupal.jsEnabled){       
    $(document).ready(mynamespace.init);    
}

</script>

答案 2 :(得分:1)

小心使用$(document).ready(mynamespace.init);。以这种方式执行时,this不再是mynamespace的引用,通常它等于window,但jQuery在后台执行一些call魔法设置它等于document。在这种情况下,它不会伤害到你,但在将来要警惕它。

$(document).ready(function () {
    mynamespace.init();
});

我是怎么做的。

在这种情况下,代码无效的原因是mynamespace的init方法未在文档$(document).ready(mynamespace.init)上定义。

答案 3 :(得分:0)

令我感到奇怪的是,至少在C#中工作,是命名空间不应该直接包含代码逻辑。在C#中它不能,这就是类的用途。所以对我来说,在名称空间上使用init函数是一个矛盾。

答案 4 :(得分:0)

是的,您可以使用object作为命名空间。形成命名空间的另一种方法是使用closures

(function(inner_variable_1, inner_variable_2) {

    // define whatever here, they won't pollute namespace outside this closure

})(outer_variable_1, outer_variable_2);

流行的例子是jQuery的noconflict-mode,它允许你在你的jQuery代码中使用$ variable而不需要$ a全局变量,从而将全局$留给另一个用途。