2012-01-04 3 views
2

を理解し、誰もが、次のコードを片付けに関する提案を持っています:どのように書いて、清潔に保つために、簡単にJavascriptの&jQueryの

/* Example code only to demonstrate the type of code my app contains and 
will contain more of */ 

$("#filter").click(function() 
{ 
    if($(this).attr("value") != "" && $(this).attr("value").length > charLimit) 
     filterable($(this).attr("value")) 
}); 

$("#filter").keyup(function() 
{ 
    if($(this).attr("value") == "" || $(this).attr("value").length <= charLimit) 
    { 
     $('.alphablock').show(300); 
     $('.filterable a').removeClass("selected"); 
    } 
}); 

$('.slidingForm fieldset').hide(); 

$('.slidingForm fieldset:first').find(':input:first').focus(); 

/* Snip More Code */ 

は基本的に私は私の要素のそれぞれのコードの多くで終わる、これはちょうど材料の海、これは動作しますが、それは維持し、開発するために大きくて困難になるだろう。

私はPHPをよく知っていますし、通常は保守可能なブロックにコードを保持するためのクラスに頼っています。しかし、私はjQueryと一般的なjavascriptのための最良のアプローチが不確実です。これは手続きが少なく、ユーザーの操作に応じていつでも呼び出すことができるため、全く違った使い方です。

おかげ ジェイク

+0

整理するとどういう意味ですか?それは私にはきれいに見える。 –

+0

私は、他の人がフォローし、自分自身を将来的に発展させるために、より論理的な順序でアイテムを配置することを意味します。現時点では、多くのセレクタとそのアクションのリストですが、何を見つけるべきかについては構造体がありません。コメントは役に立ちますが、これまでの回答は素晴らしいです。 –

答えて

0

は、Model-View-Controllerの方法でコードを整理するBACKBONE.JS、AngularJSのように、Javascriptのフレームワークの1つを使用してみてください。

+0

本当にこのプログラムにMVCアーキテクチャを使用する必要がありますか?上記の場合、モデルやコントローラは必要ありません。 JQueryはビューにのみ使用されています。 –

+1

KnockOut Jsを参照しても本当に良い答えがありました。その答えは消えました、これは次善です。 Thanks kaz –

+0

KnockoutJSはAngularと似ていますが、Angularは素晴らしいです。私はしばらくそれを使用し、それは素晴らしかったです。 – kaz

0

追記:使用http://documentcloud.github.com/backbone/

私のテイク:私は一般的に2つのことをするだろう

$filter = $("#filter") 
$filter.click(function(){ 
    var value = $(this).attr("value"); 
    if(value != "" && value.length > charLimit){ 
    filterable(value) 
    } 
}); 

$filter.keyup(function(){ 
    var value = $(this).attr("value"); 
    if(value == "" || value.length <= charLimit){ 
     $('.alphablock').show(300); 
     $('.filterable a').removeClass("selected"); 
    } 
}); 

$('.slidingForm fieldset').hide(); 
$('.slidingForm fieldset:first').find(':input:first').focus(); 
0

:共通の機能について

  • ルック大会ベースのプラグインにリファクタリングすることができ、それらを再利用しようとする。
  • それは自分のjsファイルの各主要ビューを与え、ちょうどビュー負荷が
1

きれいなものを維持するとき、それはすべてのかなりきれいだとロードが、私は最近、私がすることをやっているいくつかのものがありますお勧め:

(function($) 
{  
    "use strict"; 

    // Variables declared here are scoped to this function, won't polute 
    // the globals. 

    $(function() 
    { 
     // Do your work here. 
    }); 

})(jQuery); 

が関数自体の中でスクリプトを囲む、あなたは世界的に作成されません変数を宣言することができます。あなたがグローバルな何かをするために定義さ場合は、windowオブジェクトに割り当て:

window.something = {}; 
私も変数にあなたのjQueryオブジェクトを割り当てることを検討したい

は、例えば同じオブジェクト、のはポイントを作るリピート選択肢はありません$("#filter"),など

最後に、クラスセレクタを使用している場合は、タグ名の前に接頭辞を付けることをお勧めします。 $(".slidingForm")の代わりに$("div.slidingForm")です。単純なページの違いに気づかないかもしれませんが、多くの選択を行っているより複雑なページでは、ネイティブのgetElementsByTagNameメソッドを使用してブラウザが要素のサブセットを引き出して、 DOM全体をトラバースする必要はありません。

0

動的バインディングの必要がなければ、むしろonClickを直接要素に入れてバインドするのを避ける傾向があります。私のHTMLファイルは通常空の構造体です。

<div id="content"> 
    <div id="sidebar" /> 

そんなことです。私はそれらをjQueryを使って動的に埋めます。私のjsファイルは、オブジェクトのページやクラスなどの機能領域に編成されており、すべて対応するcssファイルを持っています。

js/basicstuff.js 
js/someclass/class1.js 
css/basicstuff.css 
css/someclass/class1.css 

プロトタイプjsファイルとそのオーバーライドがあまりにも、名前空間を共有する:私のようなファイル構造で終わります。私はかなり大きなアプリケーションをこのように書いてきましたが、個々のファイルjscssは、アプリケーションの機能領域(イントロ、セットアップ、ステージ1、メイン、エンディング、設定など)で分けられているため、ゲーム)。

また、動的関数グループの配列を意味があるときに使用します。たとえば、グローバル$(window).resize()関数を使用します。この関数は配列を反復し、必要なページ定義のサイズ変更関数を呼び出します。ページが次のページに移行するとき、配列内のその要素を削除するだけです(ただし、何かを傷つけることはありませんが無視するために余分な計算サイクルがかかります)。

+0

jQueryでイベントハンドラをバインドするのがベストプラクティスと考えられます。 HTMLと機能コードが混在していると、懸念の分離に違反します。 編集 - あなたの答えをもう一度読んで、私があなたと同意していると思う:P – jbabey

+0

それは@jbabeyがわかります。私は、ビジュアルエディタ(Visual StudioやXCodeなど)と同様にイベントをオブジェクトにバインドする方法でUI作成プロセスを考える傾向があります。バインディングはコードで解決されますが、定義は属性タイプのダイアログで発生する傾向があり、それを視覚的要素と関連付けます。私はそれがウェブページで私のために引き継ぐと思う。 –

1

私はあなたがきれいなことを意味するのか分かりません。しかし、私はいつも引数としてFunctionDeclarationを渡すことをお勧めします。そうすることで2つの利点を有する:

  1. JavaScriptの宣言が掲揚されているので、FunctionDeclarationは、スクリプトの最後に配置することができ、それは引数として参照することができます。
  2. Functionは、スタックトレースにエラーを投げた正確な機能が表示されるため、常にデバッグが容易です。

これは、これらの線に沿ってより多くのコードを書かれています:

(function() { 
    /* Example code only to demonstrate the type of code my app contains and 
    will contain more of */ 

    var filter = $("#filter"); 
    filter.click(filterClick); 
    filter.keyup(filterKeyup); 
    $('.slidingForm fieldset').hide(); 
    $('.slidingForm fieldset:first').find(':input:first').focus(); 

    /* Snip More Code */ 

    function filterClick() { 
     if ($(this).attr("value") !== "" && $(this).attr("value").length > charLimit) { 
      filterable($(this).attr("value")); 
     } 
    } 

    function filterKeyup() { 
     if ($(this).attr("value") === "" || $(this).attr("value").length <= charLimit) { 
      $('.alphablock').show(300); 
      $('.filterable a').removeClass("selected"); 
     } 
    } 
})(); 
0

あなたは「名前空間」オブジェクトにすべてを入れて、あなたのイベントハンドラを初期化する方法(関数である特性)を呼び出すことができます。これは物事をきちんと整理した状態に保ちます

$(document).ready(function() { 
    filter.initialize('filter'); 
}); 

var filter = (function() { 
    var initialize = function (filterID) { 
     var that = $('#' + filterID); 

     that.click(function() { 
      var value = that.val(); 

      if (value != '' && value.length > charLimit) { 
       filterable(value); 
      } 
     }); 

     that.keyup(function() { 
      var value = that.val(); 

      if (value == '' || value.length <= charLimit) { 
       $('.alphablock').show(300); 
       $('.filterable a').removeClass("selected"); 
      } 
     }); 

     $('.slidingForm fieldset').hide(); 
     $('.slidingForm fieldset:first').find(':input:first').focus(); 
    }; 

    return { 
     initialize: initialize 
    }; 
}); 
関連する問題