2011-07-05 7 views
6

私はJavaScriptとOOPに精通していますが、UI(HTML)のプログラミングに使用されるJSクラスの設計にはほとんど慣れていません。私はちょっと調べたことがありますが、流行のパターンは見当たりません。DOMのUIオブジェクトを表すJavaScriptクラスを設計するためのベストプラクティスは何ですか?

私は、パネルのようなオブジェクト(Microsoft Windowsパネルに似ています)を動的に作成したいとしましょう。各オブジェクトには、コンテナ、テキストラベルを含むことができるヘッダー領域、およびクリックイベントハンドラを持つ閉じるボタンが必要です。 DOM表現(HTML)に加えて、オブジェクトにはJavaScriptオブジェクト表現(変数とメソッド)もあります。私が試した1つの方法は次のとおりです。

// 
// Window class 
// 
var Window = function(params) { 
    this.testMethod = function() { 
     console.log('test'); // just an example 
    } 

    this.windowDiv = document.createElement('div'); 
    this.windowDiv.style.width = params.width + 'px'; 
    this.windowDiv.style.height = params.height + 'px'; 
    this.windowDiv.style.position = 'absolute'; 
    this.windowDiv.style.top = '30px'; 
    this.windowDiv.style.left = '30px'; 
    this.windowDiv.style.border = '1px solid #000'; 

    this.headerDiv = document.createElement('div'); 
    this.headerDiv.style.width = '100%'; 
    this.headerDiv.style.height = '30px'; 
    this.headerDiv.style.background = '#bbb'; 
    this.headerDiv.style.borderBottom = '1px solid #000'; 
    this.headerDiv.innerHTML = params.title; 

    this.buttonDiv = document.createElement('div'); 
    this.buttonDiv.style.width = '30px'; 
    this.buttonDiv.style.height = '18px'; 
    this.buttonDiv.style.position = 'absolute'; 
    this.buttonDiv.style.top = '0px'; 
    this.buttonDiv.style.right = '5px'; 
    this.buttonDiv.style.textAlign = 'center'; 
    this.buttonDiv.style.background = 'red'; 
    this.buttonDiv.style.border = '0px 1px 1px 1px solid #000'; 
    this.buttonDiv.innerHTML = 'x'; 
    this.buttonDiv.addEventListener('click', function(e) { 
     document.body.removeChild(e.target.parentNode.parentNode); 
    }, false); 

    this.headerDiv.appendChild(this.buttonDiv); 
    this.windowDiv.appendChild(this.headerDiv); 
    document.body.appendChild(this.windowDiv); 
} 

// Initialize 
var myWindow = new Window({ 
    width: 400, 
    height: 200, 
    title: 'My Window' 
}); 
myWindow.testMethod(); 

これは「正しく」感じません。もう1つの方法は、render()メソッドを用意し、それを使ってHTML生成コードを分離する方法です。 JSオブジェクトには、その内部に複数のネストされたHTMLオブジェクトが含まれているように見えます。 innerHTMLを介してネストされたタグを渡すだけですか?

私は好奇心が強いです...ここで最善のアプローチは何ですか? DOMコード(HTMLオブジェクトとスタイリング)と伝統的な変数とメソッドを持つクラスを設計する最良の方法は何ですか?これらのHTMLオブジェクトにプロトタイプを使用する方法はありますか?この例では、インスタンス化されたWindowオブジェクトを含むWindowManagerクラスもあり、それらを管理し、新しいオブジェクトを作成することができます。また、HTML表現も可能です。

上記のうちいくつかは静的なCSSで処理し、ID /クラスを適用してコードの一部を整理することもできますが、位置付けとサイズをプログラムで達成する必要があるとしましょう(サイズ変更、ドラッグ・ドロップなどを処理するため) )。

私は、ExtJS、jQueryなどで提供されるフレームワークレベルのソリューションには興味がありません。自家製コードのベストプラクティスについて教えてください。実際、私は、フレームワークのエンジニアがUIクラスをどのように設計しているかを知ることに興味があります。

+0

jQueryとjQueryUIはオープンソースです。あなたはいつも見ることができます;)https://github.com/bmsterling/jquery-ui – AlienWebguy

+1

John Resig(jQuery)は、私が今まで見たことのない最も包括的なデザインディスカッションを提供しています。あなたはそこから始める必要があります。 – dkretz

答えて

2

オブジェクトのHTML部分については、テンプレートを使用してコンポーネントのHTML構造を定義し、コンポーネントの初期化時に必要なデータを差し込みます。テンプレート関数を実装する方法はたくさんありますが、例としてunderscore.jsを見てください。

スタイルについては、デフォルト値をスタイルシートに入れます。後でjavascriptで修正する必要があるかどうかは関係ありません。たとえCSSで定義されていても機能します。コンポーネントに含める唯一の情報は、コンポーネントが起動するさまざまなイベントのデフォルトの動作です。

また、ベースの「クラス」内に共通のプロパティを入れるための簡単なプロトタイプチェーンを作成することもできます(javascriptには実際のクラスがないことを理解してください)。また、これを行うextend関数の例についてはunderscore.jsを参照してください。検索可能な他の実装の中でも特に有用である。

結局のところ、あなたのコードは使いやすく、理解しやすく、合理的にうまく動作します。また、うまく動作しない部品を改善したり、コードをモジュールに再編成することもできます。

+0

ありがとうございました。私はこれを見て、それは非常に有用です。私はそれを実際に何ができるのかを見るために今週末にもう一度試してみるつもりです。それはまた、賢明だったマイクロ・テンプレートのJohn Resigの議論にもつながりました。 – skyline3000

0

BACKBONE.JSがあなたの規定の要件に適している:

http://documentcloud.github.com/backbone/

私はテンプレート内のHTMLを保存し、コントローラが管理するビジュアル要素(各インスタンスごとに動的に作成DIV)にそれらをロード..これはUIの各インスタンスに固有のUIの再利用可能なhtml要素とメソッドとプロパティを提供します。

関連する問題