Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/472.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何让一些模块代码只在DOM就绪后运行?_Javascript_Jquery_Jquery Validate_Module Pattern_Revealing Module Pattern - Fatal编程技术网

Javascript 如何让一些模块代码只在DOM就绪后运行?

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({ // ...

我们使用显示模块模式将内容组织到“名称空间”。一些初始化代码(用于jQuery验证插件)只应在加载文档后调用

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中的情况),但问题仍然是一样的。你怎么知道它从未运行过?它应该按照你发布的那样工作。你能做一个演示吗?