2011-02-05 8 views
0

私はjavascriptとJQueryでnewbですので、きれいで整理されたコードを書くのに苦労しています。以下のコードはちょっと感じが悪く、わかっています。ここに私のコードがどのように見えるかのサンプルがあります。関数、オブジェクト、クラスを使って改善する方法についての提案やコメントがあれば、それはすばらしいでしょう。清潔に整理されたJavaScriptコードを書くのに助けが必要

以下のコードでは、データテーブルプラグインを使用しています。通常、このページにはすべてのコードが含まれています。まだ多くのイベントハンドラがありますが、先に書いたものを手に入れてから、あまりにも深くなってしまいます。

var timefiller = $("<ul></ul>").addClass("dataTables_TimeFilter"); 
$(["Day", "Week", "Month", "All", "Last 30 Days"]).each(function() { 
    $("<a></a>").text(this).attr("href", "myhref").wrap("<li />").appendTo(timefiller); 
}); 

これはへ

var plannerTable; 


$(function() { 

    // Initialize datatable object 
    plannerTable = $('#plannerTable').dataTable 
    ({ 
     "bJQueryUI": true, 
     "bFilter": true, 
     "sPaginationType": "full_numbers", 
     "oLanguage": 
      { 
       "sZeroRecords": "Add some tasks to your planner" 
      }, 
     "aoColumns": 
      [ 
       { "bSortable": true, "bSearchable": false }, // task id 
       {"bSortable": true, "bSearchable": false }, // course 
       {"bSortable": false, "bSearchable": false }, // Edit 
       {"iDataSort": 2 }, // due date 
       null, // task 
       {"bSortable": false, "bSearchable": false }, // Options  
       {"bSortable": false, "bSearchable": false} // Delete  
      ] 
    }); 


    /* Insert Time Filter Controls into datatable */ 
    var filterHtml = [ 
     '<ul id="plannerTable_TimeFilter" class="dataTables_TimeFilter">', 
     '<li><a href="#">Day</a></li>', 
     '<li><a href="#">Week</a></li>', 
     '<li><a href="#">Month</a></li>', 
     '<li><a href="#">All</a></li>', 
     '<li><a href="#">Last 30 Days</a></li>', 
     '</ul>' 
    ] 

    $('#plannerTable_filter').after(filterHtml.join('')); 



    var dateFilters = $('#plannerTable_TimeFilter li'); 

    /* setup filter click event */ 
    dateFilters.click(function() 
    { 
     var dateFilter = $(this).text().replace(/\s+/g, ''); 

     /* Get tasks by date range */ 
     $.getJSON('/Planner/Planner/GetTasksByDateRange', { 'dateFilter': dateFilter }, function (data) 
     { 
      plannerTable.fnClearTable(); 

      $.each(data, function (key, value) 
      { 
       var row = createTableRow(value); 

       /* add row to table */ 
       plannerTable.fnAddTr($(row)[0], true); 
      }); 
     }); 
    }); 


    /* 
    * Function: createTableRow 
    * Purpose: Creates an HTML Row using the html in this function 
    * Returns: constructed html row 
    * Inputs: row data object 
    */ 
    function createTableRow(value) 
    { 

     var date = new Date(parseInt(value.DueDate.substr(6))); 

     /* convert date to proper format */ 
     /* construct html row */ 
     var row = [ 
      '<tr>', 
       '<td style="display: none;">' + value.TaskId + '</td>', 
       '<td class="tag-bg" style="width: 10px;">', 
        '<span class="tag" style="background-color:' + value.CourseBackgroundColor + '" title="' + value.CoursePrefix + '">&nbsp;' + '</span>', 
        '<span style="display: none;">' + value.CoursePrefix + '</span>', 
       '</td>', 
       '<td class="edit">', 
        '<a href="#"><img src="../../../../Content/Images/Planner/edit-icon.png" /></a>', 
       '</td>', 
       '<td class="due-date">' + value.DueDate + '</td>', 
       '<td class="task-col">' + value.TaskName + '</td>', 
       '<td class="options">', 
        '<a class="desc" href="#"><img src="../../../../Content/Images/Planner/desc-off-icon.png" /></a>', 
        '<a class="alert" href="#"><img src="../../../../Content/Images/Planner/bell-off-icon.png" /></a>', 
       '</td>', 
       '<td class="delete">', 
        '<a href="#"><img src="../../../../Content/Images/Planner/delete-icon.png" /></a>', 
       '</td>', 
      '</tr>' 
     ] 

     return row.join(''); 
    } 
}); 

答えて

1
/* Insert Time Filter Controls into datatable */ 
var filterHtml = '<ul id="plannerTable_TimeFilter" class="dataTables_TimeFilter">' + 
       '<li><a href="#">Day</a></li>' + 
       '<li><a href="#">Week</a></li>' + 
       '<li><a href="#">Month</a></li>' + 
       '<li><a href="#">All</a></li>' + 
       '<li><a href="#">Last 30 Days</a></li>' + 
      '</ul>'; 
$('#plannerTable_filter').after(filterHtml); 

は、あなたが「」に変更したいので、もしそれが、より良い方法で再帰的なものを使用するだけの方法で、あなたが使うべきものではありませんあなたは6回かn回する必要はありません。

あなたの仕事のために、私は非常にjqueryのtemplプラグインですが、それはベータ版ですが、あなたが必要とするように働いています。これは何か個人的には行かないからです。

var row = '<tr>' + 
         '<td style="display: none;">' + value.TaskId + '</td>' + 
         '<td class="tag-bg" style="width: 10px;">' + 
          '<span class="tag" style="background-color:' + value.CourseBackgroundColor + '" title="' + value.CoursePrefix + '">&nbsp;' + '</span>' + 
          '<span style="display: none;">' + value.CoursePrefix + '</span>' + 
         '</td>' + 
         '<td class="edit">' + 
          '<a href="#"><img src="../../../../Content/Images/Planner/edit-icon.png" /></a>' + 
         '</td>' + 
         '<td class="due-date">' + value.DueDate + '</td>' + 
         '<td class="task-col">' + value.TaskName + '</td>' + 
         '<td class="options">' + 
          '<a class="desc" href="#"><img src="../../../../Content/Images/Planner/desc-off-icon.png" /></a>' + 
          '<a class="alert" href="#"><img src="../../../../Content/Images/Planner/bell-off-icon.png" /></a>' + 
         '</td>' + 
         '<td class="delete">' + 
          '<a href="#"><img src="../../../../Content/Images/Planner/delete-icon.png" /></a>' + 
         '</td>' + 
        '</tr>'; 
+0

私は自分のjsでもhtmlを置くのが好きではありませんが、データテーブルのスタイリングの量のために、そのか厄介なサーバー側の解決策:( – chobo

3

コードを少しきれいにするだけでなく、パフォーマンスを向上させるヒントが1つあります。文字列の連結を使用してjsにhtmlを作成しないでください。配列を使用します。

var filterHtml = [ 
    '<ul id="plannerTable_TimeFilter" class="dataTables_TimeFilter">', 
    '<li><a href="#">Day</a></li>', 
    '<li><a href="#">Week</a></li>', 
    '<li><a href="#">Month</a></li>', 
    '<li><a href="#">All</a></li>', 
    '<li><a href="#">Last 30 Days</a></li>', 
    '</ul>'  
] 
$('#plannerTable_filter').after(filterHtml.join('')); 

あなたがjsの配列からリストを構築する必要がある場合は、同じ技術を使用することができますが:

var data = [1,2,3,4,5,6], 
    html = ['<ul>']; 

for(var i=0,len=data.length; i<len; i++){ 
    html.push('<li>'+data[i]+'</li>'); 
} 
html.push('</ul>'); 

$(target).html(html.join('')); 

、縦方向の空白を恐れてはいけません。コードを分割して縦方向にまとまらないようにするのに役立ちます。

あまりにも多くのコメントを追加します。コード構文の強調表示を持つエディタを使用している場合、通常、コメントはコードとは異なる色で表示されます。コード内で何が起きているかを継続的に文書化するだけでなく、コードを理解しやすくするために色を追加するという利点があります。

+0

文字列連結のヒントをありがとう:)私はコードスニペットをコーディングし、他のセクションを更新しました。オブジェクト、クラス、関数を使って改善できる領域は他にもありますか? – chobo

+0

あなたの仕事の種類も好きです! – Luke

+1

このヒントをありがとう!私は昨夜この記事を読んでいましたが、今はこのヒントを適用しています。私のコードは今より読みやすくなります:P –

2

私はルークに同意します。大量のHTMLをJavaScriptで書く場合は、JSONを出力し、jQuery Templates、Mustache、またはPUREを使用します。

私は現在のプロジェクトでそれを実装しようとしている最中です。それははるかにJSベースであることが分かりました。そのように、HTMLの束を出力し、何度もDOM操作を実行しなければならないことは、パフォーマンスを阻害するようになっています。

jQueryのベストプラクティスとjQueryのパフォーマンス - jQueryのベストプラクティスに関する多くの情報があります。

長年にわたって私が学んだことの1つは、継続的にプログラムすることです。私は自分がやりたいことをするのではなく、正しいべきことに巻き込まれています。プログラム。 私はテストし、それが受け入れられる私のコードのベンチマークで構築することを確認します。そこから、私は物事を行うためのより良い、そして新しい方法を見つけるように、私は常にリファクタリングしています。

幸運を祈る!

関連する問題