Javascript 如何让一些模块代码只在DOM就绪后运行?
我们使用显示模块模式将内容组织到“名称空间”。一些初始化代码(用于jQuery验证插件)只应在加载文档后调用Javascript 如何让一些模块代码只在DOM就绪后运行?,javascript,jquery,jquery-validate,module-pattern,revealing-module-pattern,Javascript,Jquery,Jquery Validate,Module Pattern,Revealing Module Pattern,我们使用显示模块模式将内容组织到“名称空间”。一些初始化代码(用于jQuery验证插件)只应在加载文档后调用 Namespace.Foo.Bar = (function($) { var init = function() { $(function() { // <--- within DOM ready wrapper it never runs $.validator.setDefaults({ // ...
Namespace.Foo.Bar = (function($) {
var init = function() {
$(function() { // <--- within DOM ready wrapper it never runs
$.validator.setDefaults({
// ...
});
});
(function(){ // <--- but within an IIFE it will run
$.validator.setDefaults({
// ...
});
})();
};
init();
// public functions/variables
return {
};
}(jQuery));
Namespace.Foo.Bar=(函数($){
var init=函数(){
$(function(){/您应该尝试$(document).ready()
由于您定义函数的方式(即init
),它不起作用。请参阅
执行init()
时,尚未定义init
函数,您将得到一个错误
Namespace.Foo.Bar = (function($) {
// init this module
console.log(typeof init); // this prints `undefined`
init(); // this throws an error
// module initialisation
var init = function() {
...
}
...
}(jQuery));
您应该将init()
调用移动到函数体的末尾,或者使用以下命令定义函数:
function init() { ... }
我相信你要找的是这样的东西:
请注意这两个示例之间的区别:
//working
var myNamespace = (function($) {
$(function(){
var init = (function(){
var text = document.createTextNode("Everything's ready!");
document.body.appendChild(text);
})();
});
}(jQuery));
//Error: Cannot call method 'appendChild' of null
var myNamespace = (function($) {
var init = (function(){
var text = document.createTextNode("Everything's ready!");
document.body.appendChild(text);
})();
}(jQuery));
尽管如此,这里发生的是init()实际上不能被名称空间中的任何其他对象访问,因为它是在加载DOM之后发生的
尽管如此,我认为这接近于你的问题所在
我假设您希望模块中的DOM就绪包装器用于组织目的
还请注意,您可以从模块外部正常访问模块:
//appends to the body: "Everything's ready!undefined
var myNamespace = (function($) {
var private = " Hello world";
$(function(){
var hello =(function(){
var text = document.createTextNode("Everything's ready!" +myNamespace.private);
document.body.appendChild(text);
}());
});
return{
public: " Hello World"
}
}(jQuery));
//works as expected
var myNamespace = (function($) {
var private = " Hello world";
$(function(){
var hello =(function(){
var text = document.createTextNode("Everything's ready!" +myNamespace.public);
document.body.appendChild(text);
}());
});
return{
public: " Hello World"
} }(jQuery));
编辑Q以在声明后显示init调用(这是在codebase btw中的情况),但问题仍然是一样的。你怎么知道它从未运行过?它应该按照你发布的那样工作。你能做一个演示吗?