HTML からの独立
デザイン要素を HTML から切り離すのと同じように、動的要素を HTML から切り離したい。一般的にはトリガーとなる呼び出し部分が HTML 側に残るが、それすらも JavaScript ファイルの方に移したいと思って、やってみたのがこれ。業務系の開発では有効なテクニックとなるはずだ。
<html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <script src="melchior.js" type="text/javascript"></script> <script src="scr001.js" type="text/javascript"></script> </head> <body> <div id="id1">Click me!</div> <form> <input type="text" value="ここは無関係" /> <input type="submit" id="id2" /> </form> </body> </html>
通常であればイベントに JavaScript を指定するところに、id の指定だけを行っておくことで、HTML を JavaScript で汚さないようにする。
// -- scr001.js -- // これが画面単位の実装になる。 // 最初に melchior.initialize にオブジェクトを渡す。 window.onload = function() { melchior.initialize(scr001); } var scr001 = { // 関数紐付け定義 actions: [ { id:'id1', event:'onmousedown', func:'action_id1' }, { id:'id2', event:'onmousedown', func:'action_id2' } ], // アクション id1 action_id1: function() { $('id1').style.color = "red"; }, // アクション id2 action_id2: function() { alert('clicked'); } };
window.onload = function() と書くことで、HTML の読み込みが終わったら、特定の処理を実行させることができる。ここでは、作成中のフレームワーク melchior を呼び出している。melchior に渡すのがは、id とイベントと JavaScript 関数を関連づけた配列である。もうちょっといろいろやらせる予定なので、少し冗長な記述となっているが、意図は通じるだろう。
// -- melchior.js -- // ライブラリ (prototype.js を使う場合は削除) function $(id) { return document.getElementById(id); } // melchior の本体 var melchior = { initialize: function(obj) { var items = obj.actions; for (var i in items) { $(items[i].id)[items[i].event] = obj[items[i].func]; } } };
melchior (仮名) で、id とイベントと JavaScript 関数の紐付けを行っている。これで HTML 要素に onmousedown="hogehoge()" と書く必要がなくなる。