2016-07-08 44 views
1

我正在嘗試按日期排序包含一些文本和日期的表列。我在前面放置了一個隱藏的跨度,僅包含日期,並使用textExtraction來獲取日期,以便我可以使用分揀器「shortDate」進行排序。但是當我點擊標題時什麼也沒有發生。使用textExtraction與jQuery tablesorter的問題

我測試了jsFiddle上的代碼,它的工作原理讓我對這一切更加驚訝。任何想法可能會導致這一點將不勝感激。

的JS:

function dataTable(table) { 
$(table).addClass('ui-widget tablesorter'); 
$(table).children('thead').addClass('ui-widget-header'); 
$(table).children('tbody').addClass('ui-widget-content'); 
$(table).children('tbody').children('tr').hover(
    function(){$(this).addClass('ui-state-hover');}, 
    function(){$(this).removeClass('ui-state-hover');} 
); 
} 

$(document).ready(function() { 
$('.dataTable').each(function() { 
    dataTable($(this)); 
}); 
}); 

$(document).ready(function(){ 
     $('.dataTable').tablesorter({ 
      widgets: ['staticRow'], 
      dateFormat: 'ddmmyyyy', 
      textExtraction: {7 : function(node) { 
        return $(node).find("span").text(); 
        } 
      }, 
      headers:{ 
       5:{sorter: "shortDate"}, 
       7:{sorter: "shortDate"} 
      } 
     }); 
     $(".dataTable").data('tablesorter').sortList = [[7,1]]; 
     $(".dataTable").trigger('update'); 
    }); 

的HTML:

<table class="dataTable" border="1" style="border-collapse:collapse"> 
     <thead> 
      <tr><th>Version</th><th>Lot</th><th>Lot N°</th><th>Environnement</th><th>Créateur</th><th>Date de création</th><th>Planification</th><th>Etat</th></tr> 
     </thead> 
     <tbody id="searchable"> 
      <c:forEach var="version" items="${demandes}" varStatus="status"> 
      <c:forEach var="demandeInstallation" items="${version}" varStatus="status2"> 
       <tr> 
       <td><c:out value="${livrables[status.index].version}"></c:out></td> 
       <td><c:out value='${demandeInstallation.lot}'/></td> 
        <td><fmt:formatNumber value="${demandeInstallation.numeroLot}" pattern="0000"/></td> 
        <td><c:out value='${demandeInstallation.environnement}'/></td> 
        <td><c:out value='${demandeInstallation.demandeur}'/></td> 
        <td><fmt:formatDate value="${demandeInstallation.date}" pattern="dd/MM/yyyy HH:mm"/></td> 
        <td> 
        <c:if test="${!empty demandeInstallation.planification}"> 
        <fmt:formatNumber value="${demandeInstallation.planification div 60}" pattern="##"/>:<fmt:formatNumber value="${demandeInstallation.planification mod 60}" pattern="00"/> 
        </c:if> 
        </td> 
        <c:if test="${!empty demandeInstallation.etat.etat}"> 
        <td class="etatDemande_${demandeInstallation.etat.etat}"><fmt:formatDate value="${demandeInstallation.etat.createdOn}" pattern="dd/MM/yyyy HH:mm" var="createdOn"/><span style="display:none"><c:out value="${createdOn}"/></span><s:message code="EtatDemande.${demandeInstallation.etat.etat}" arguments="${createdOn}, ${demandeInstallation.etat.createdBy}"/></td> 
        </c:if> 
       </tr> 
      </c:forEach> 
      </c:forEach> 
     </tbody> 
    </table> 
    <script type="text/javascript" src="<s:url value="/js/searchbar.js"/>"></script> 
</body> 

編輯:用於searchBar.js代碼:

var $rows,$pageNumber,$rowsPerPage; 
$('#searchBar').keyup(function() { 
    var val = $.trim($(this).val()).replace(/ +/g, ' ').toLowerCase().split(' '); 

    $rows.hide().filter(function() { 
    var text = $(this).text().replace(/\s+/g, ' ').toLowerCase(); 
    var matchesSearch = true; 
    $(val).each(function(index, value) { 
     matchesSearch = (!matchesSearch) ? false : ~text.indexOf(value); 
    }); 
    return matchesSearch; 
    }).show(); 

    var j = $pageNumber * $rowsPerPage; 
    for (i = 0; i < $rows.length; i++){ 
     if($rows.eq(i).is(':visible') && j < $rowsPerPage*($pageNumber + 1)){ 
      j++; 
     } 
     else{ 
      $rows.eq(i).hide(); 
     } 
    } 
    if (j < $rowsPerPage){ 
     $('#moreResults').hide(); 
    } 
    else{ 
     $('#moreResults').show(); 
    } 
    $('#searchTextField').val($(this).val()); 
}); 

$(document).ready(function(){ 
    /*for (i = 0; i < $rows.length ; i++){ 
     if (i < $pageNumber*$rowsPerPage || i >= $rowsPerPage*($pageNumber + 1)) 
     { 
      $rows.eq(i).hide(); 
     } 
    }*/ 
    $rows = $('#searchable tr'); 
    $pageNumber = $('#pageNumber').val(); 
    $rowsPerPage = $('#rowsPerPage').val(); 
    $('#searchBar').val($('#searchTextField').val()); 
    $('#searchBar').keyup(); 
}); 

編輯2

我使用的調試和發現我是初始化的tablesorter不工作,所以我改變了我的代碼,第二次:

$(document).ready(function() { 
     $(".dataTable").data('tablesorter').debug = true; 
     $(".dataTable").data('tablesorter').textExtraction = {7: function(node) {return $(node).find("span").text();}}; 
     $(".dataTable").data('tablesorter').headers = {5: { sorter: "shortDate" },7: { sorter: "shortDate" }}; 
     $(".dataTable").data('tablesorter').sortList = [[7,1]]; 
     $(".dataTable").trigger('update'); 
    }); 

控制檯輸出: 看來,文本提取不因爲列7的內容仍然以「日期文本日期文本」的形式而不是僅僅第一個日期來應用。

Debug log

+0

你爲什麼驚訝它的工作原理? – gcampbell

+0

對不起,我不是很清楚,它適用於jsFiddle,但不適用於我的應用程序。 _編輯問題以使其更清晰_ – anaBad

+0

什麼是'? – gcampbell

回答

1

在發現沒有辦法讓我的網頁上textExtraction工作,我想出瞭解決辦法是把一個只包含日期我想顯示的列前進行排序隱藏列。

結果看起來像這樣:

在包括在頭一個單獨的文件「dataTable.js」,代碼初始化的tablesorter爲類的tablesorter的任何表:

$(document).ready(function() { 
    $('.dataTable').tablesorter({ 
     widgets: ['staticRow'], 
     dateFormat: 'ddmmyyyy' 
    }); 
}); 

在包含問題表的jsp:

<head> 
    <title>Historique</title> 
    <%@ include file="/head.jsp" %><!-- This is where dataTable.js is included--> 
    <script type="text/javascript"> 
     $(document).ready(function() { 
      $(".dataTable").data('tablesorter').sortList = [[7,1]]; 
      $(".dataTable").trigger('update'); 
     }); 
    </script> 
</head> 
<body> 
    <table class="dataTable" border="1" style="border-collapse:collapse"> 
     <thead> 
      <tr><th>Version</th><th>Lot</th><th>Lot N°</th><th>Environnement</th><th>Créateur</th><th>Date de création</th><th>Planification</th><th colspan="2">Etat</th></tr> 
     </thead> 
     <tbody id="searchable"> 
      <c:forEach var="version" items="${demandes}" varStatus="status"> 
      <c:forEach var="demandeInstallation" items="${version}" varStatus="status2"> 
       <tr> 
       <td><c:out value="${livrables[status.index].version}"></c:out></td> 
       <td><c:out value='${demandeInstallation.lot}'/></td> 
        <td><fmt:formatNumber value="${demandeInstallation.numeroLot}" pattern="0000"/></td> 
        <td><c:out value='${demandeInstallation.environnement}'/></td> 
        <td><c:out value='${demandeInstallation.demandeur}'/></td> 
        <td><fmt:formatDate value="${demandeInstallation.date}" pattern="dd/MM/yyyy HH:mm"/></td> 
        <td> 
        <c:if test="${!empty demandeInstallation.planification}"> 
        <fmt:formatNumber value="${demandeInstallation.planification div 60}" pattern="##"/>:<fmt:formatNumber value="${demandeInstallation.planification mod 60}" pattern="00"/> 
        </c:if> 
        </td> 
        <c:if test="${!empty demandeInstallation.etat.etat}"> 
        <td style="display:none"><fmt:formatDate value="${demandeInstallation.etat.createdOn}" pattern="dd/MM/yyyy HH:mm"/></td> 
        <td class="etatDemande_${demandeInstallation.etat.etat}"><fmt:formatDate value="${demandeInstallation.etat.createdOn}" pattern="dd/MM/yyyy HH:mm" var="createdOn"/><s:message code="EtatDemande.${demandeInstallation.etat.etat}" arguments="${createdOn}, ${demandeInstallation.etat.createdBy}"/></td> 
        </c:if> 
       </tr> 
      </c:forEach> 
      </c:forEach> 
     </tbody> 
    </table>