3

明らかにするモジュールパターンを使用して、「名前空間」に整理します。一部の初期化コード (jQuery Validation プラグイン用) は、ドキュメントのロード後にのみ呼び出す必要があります。

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));

ビットが DOM 対応ラッパー内にある場合$.validator.setDefaultsは呼び出されませんが、IIFE 内にある場合は呼び出されます。

なんで?DOM の準備ができた後に実行するモジュール コードをマークする「最良の」方法は何ですか?

編集:サンプルコードを問題のより具体的なものにしました

4

3 に答える 3

3

関数を定義する方法(つまり)が原因で機能しませんinitvar functionName = function() {} と function functionName() {}を参照してください。

を実行する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() { ... }
于 2013-04-13T14:07:59.227 に答える
0

試してみてください$(document).ready()

http://docs.jquery.com/Tutorials:Introducing_$(document).ready()

于 2013-04-13T13:59:45.583 に答える
0

あなたが探しているのは次のようなものだと思います:

次の 2 つの例の違いに注意してください。

//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));

ただし、ここで起こっていることは、DOM がロードされた後にinit()が実行されるため、事実上、名前空間内の他のものから init() にアクセスできないということです。

それにもかかわらず、これはあなたが問題を抱えていることに近いと思います...

組織的な目的で、モジュール内に 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));
于 2013-08-06T12:54:44.927 に答える