2011-02-05 2 views
0

저는 자바 스크립트와 JQuery로 newb입니다. 그래서 깨끗하고 체계적인 코드를 작성하는 데 많은 어려움을 겪고 있습니다. 아래 코드는 엉성함을 느낍니다. 다음은 내 코드의 샘플입니다. 누군가가 기능, 객체, 클래스를 통해 그것을 개선하는 방법에 대한 제안이나 의견이 있다면, 그것은 굉장 할 것입니다.깨끗한 정리 된 자바 스크립트 코드 작성을위한 도움이 필요합니다.

아래 코드는 데이터 테이블 플러그인을 사용하며 일반적으로 내 페이지의 모든 코드를 포함합니다. 계속해서 더 많은 이벤트 핸들러가 작성되어 있지만, 너무 깊이 들어가기 전에 이미 작성한 내용을 먼저 처리하고 싶습니다.

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); 

당신이 "A"로 변경하려는 경우 그래서, 더 나은 방법으로 재귀 물건을 사용하는 단지 방법입니다, 당신은 사용해야 아무것도 아니다 "b"당신은 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을 넣는 것을 좋아하지 않지만, datatable의 스타일링 때문에 그 또는 일부 불쾌한 서버 측 솔루션 :( – chobo

3

코드를 조금 더 깨끗하게 만들뿐만 아니라 성능면에서 더 효율적인 팁이 있습니다. 문자열 연결을 사용하여 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

나는 Luke와 동의 할 것입니다. 자바 스크립트로 많은 양의 html을 작성한다면 JSON을 출력하고 jQuery 템플릿, 콧수염 또는 퓨어를 사용합니다.

저는 현재 프로젝트에서 JS를 기반으로 훨씬 더 많이 구현하려고 노력하고 있습니다. 원래는 원래 생각했습니다. 따라서 HTML 묶음을 출력하고 DOM 작업을 반복해서 수행해야하는 것은 성능을 저하시킵니다.

jQuery 모범 사례 및 'jQuery 성능'은 google뿐입니다. jQuery를 사용하면 모범 사례와 관련하여 꽤 많은 것들이 있습니다.

내가 지난 몇 년간 배웠던 한 가지는 지속적으로 프로그램하는 것입니다. 나는 내가하고 싶은 일을하는 대신 옳은 일에 매달려 있음을 깨닫는다. 프로그램. 필자는 허용되는 곳에서 코드의 벤치 마크에서 테스트하고 빌드해야합니다. 거기에서, 나는 계속해서 리팩터링을하고, 일을 더 잘하고 새로운 방법을 찾는다.

행운을 빈다.

관련 문제