2012/03/04

JavaScriptのモジュールファイル群の読み込み管理をどうしよう。(2)

全体で共通的に使うモジュールではなく、htmlごとのイベントハンドラ等の初期化スクリプトをどうするか。

前提条件
  • 画面全体は遷移しない。htmlを非同期ロードして一部のdivエリアの置き換えを行う。
    便宜上最初に読み込まれるhtmlを親画面、非同期ロードされる側を子画面と呼ぶ。
  • 親画面は、子画面の初期化に必要なものが何か知らない。どのhtmlを呼ぶかは知らない。
  • 親画面1つに対して、子画面を複数ロードしない。
ファイル構成
  • test.html 親画面
  • test.js 親画面初期化スクリプト
  • screenManager.js 子画面置き換え処理スクリプト
  • subscreen
    • subscreen.html 子画面
    • subscreen.js 子画面初期化スクリプト

概要
  • 子画面は必要とするjavascriptファイルのURLを値に持つhiddenフィールドを持つ
  • 子画面置き換え処理スクリプトは、上記のhiddenフィールド値を参照して、javascriptファイルを取得する
イケてない
  • javascriptファイルのURLを相対パスで書く場合、その基準位置は子画面htmlではない。
  • 子画面初期化スクリプトが、遷移の度にロードされる。
  • CommonJSとかClosureを使えよ。

親画面(test.html)
<html>
  <head>
  </head>
  <body>
    <div class="subScreenArea">
      <p>initial contents</p>
    </div>
    <input type="button" id="changeScreen" value="screenChange" /> <br>
    <input type="text" id="loginId" />
      <input type="button" id="completing" value="completing" />
 <div id="scriptDeclaration">
   <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script>
   <script src="module.js"></script>
   <script src="test.js"></script>
 </div>
  </body>
</html>

親画面初期化スクリプト(test.js)
var mymodule = mymodule || {};
mymodule.require('./screenManager.js');
mymodule.require('./completed.js');
$(function(){
    $('#completing').click(function(){
 $('#loginId').val(mymodule.compl.getCompletedScript());
    });
    $('#changeScreen').click(function(){
 mymodule.scr.change('subscreen/subscreen.html');
    });
});

子画面(subscreen/subscreen.html)
<html>
  <head>
  </head>
  <body>
    <div class="subscreenArea">
      <input type="text" id="subText">
      <input type="button" id="subButton" value="Push">
      <input type="hidden" class="requireScript" value="./subscreen/subscreen.js">
    </div>
  </body>
</html>
子画面初期化スクリプト(subscreen/subscreen.js)
$(function(){
    console.log('require script loaded.');
    $('#subButton').click(function(){
 $('#subText').val('clicked');
    });
});

子画面取得スクリプト(screenManager.js)
function ScreenManager(){
    console.log('ScreenManager is loaded.');
    this.screenClass = 'subScreenArea';
}

ScreenManager.prototype.change = function(url){
    $('.' + this.screenClass).load(url + ' .' + this.screenClass, function(){
           $.each($(this).find('input.requireScript'), function(){
        console.log('loading ' + $(this).val());
        $.getScript($(this).val());
           });
       });
};

var mymodule = mymodule || {};
mymodule.scr = new ScreenManager();

0 件のコメント:

コメントを投稿