页面刷新后保留表格排序结果?

Posted

技术标签:

【中文标题】页面刷新后保留表格排序结果?【英文标题】:Keep table sort result after page refresh? 【发布时间】:2018-06-06 23:38:09 【问题描述】:

我正在使用 w3.js(https://www.w3schools.com/howto/howto_js_sort_table.asp) 中的表格排序器。 此外,我使用 setTimeout 每分钟刷新页面以更新数据。 我想在刷新页面后保留排序结果。 我知道有一个方法正在使用 sessionStorage,但不知道如何使用它。 谁能给我一些建议?

【问题讨论】:

页面/表格加载时可以调用 sortTable() 吗? 对不起,我忘了说我使用的是第二个例子。它给每列不同的数字。我该怎么办? 我在下面添加了一个sn-p。 【参考方案1】:

下面是SortTable 中示例的更新后的 sn-p。我们使用浏览器cookies来恢复上次的排序信息,主要是排序列和方向。 W3school 中还有另一个示例,我从中获得了 cookie 处理 (Cookies)。由于跨源策略,下面的 sn-p 在网站中将不起作用。当然,它也需要一些重构,但这是一个开始。

<!DOCTYPE html>
<html>
<head>
<title>Sort a HTML Table Alphabetically</title>
<style>
table 
    border-spacing: 0;
    width: 100%;
    border: 1px solid #ddd;


th 
    cursor: pointer;


th, td 
    text-align: left;
    padding: 16px;


tr:nth-child(even) 
    background-color: #f2f2f2

</style>
</head>
<body onload="checkCookie();">

<p><strong>Click the headers to sort the table.</strong></p>
<p>The first time you click, the sorting direction is ascending (A to Z).</p>
<p>Click again, and the sorting direction will be descending (Z to A):</p>

<table id="myTable">
  <tr>
   <!--When a header is clicked, run the sortTable function, with a parameter, 0 for sorting by names, 1 for sorting by country:-->  
    <th onclick="sortTable(0)">Name</th>
    <th onclick="sortTable(1)">Country</th>
  </tr>
  <tr>
    <td>Berglunds snabbkop</td>
    <td>Sweden</td>
  </tr>
  <tr>
    <td>North/South</td>
    <td>UK</td>
  </tr>
  <tr>
    <td>Alfreds Futterkiste</td>
    <td>Germany</td>
  </tr>
  <tr>
    <td>Koniglich Essen</td>
    <td>Germany</td>
  </tr>
  <tr>
    <td>Magazzini Alimentari Riuniti</td>
    <td>Italy</td>
  </tr>
  <tr>
    <td>Paris specialites</td>
    <td>France</td>
  </tr>
  <tr>
    <td>Island Trading</td>
    <td>UK</td>
  </tr>
  <tr>
    <td>Laughing Bacchus Winecellars</td>
    <td>Canada</td>
  </tr>
</table>

<script>
function sortTable(n, dir) 
  var table, rows, switching, i, x, y, shouldSwitch, dir, switchcount = 0;
  table = document.getElementById("myTable");
  switching = true;
  //Set the sorting direction to ascending:
  !dir && (dir = "asc"); 
  /*Make a loop that will continue until
  no switching has been done:*/
  while (switching) 
    //start by saying: no switching is done:
    switching = false;
    rows = table.getElementsByTagName("TR");
    /*Loop through all table rows (except the
    first, which contains table headers):*/
    for (i = 1; i < (rows.length - 1); i++) 
      //start by saying there should be no switching:
      shouldSwitch = false;
      /*Get the two elements you want to compare,
      one from current row and one from the next:*/
      x = rows[i].getElementsByTagName("TD")[n];
      y = rows[i + 1].getElementsByTagName("TD")[n];
      /*check if the two rows should switch place,
      based on the direction, asc or desc:*/
      if (dir == "asc") 
        if (x.innerHTML.toLowerCase() > y.innerHTML.toLowerCase()) 
          //if so, mark as a switch and break the loop:
          shouldSwitch= true;
          break;
        
       else if (dir == "desc") 
        if (x.innerHTML.toLowerCase() < y.innerHTML.toLowerCase()) 
          //if so, mark as a switch and break the loop:
          shouldSwitch= true;
          break;
        
      
    
    if (shouldSwitch) 
      /*If a switch has been marked, make the switch
      and mark that a switch has been done:*/
      rows[i].parentNode.insertBefore(rows[i + 1], rows[i]);
      switching = true;
      //Each time a switch is done, increase this count by 1:
      switchcount ++;      
     else 
      /*If no switching has been done AND the direction is "asc",
      set the direction to "desc" and run the while loop again.*/
      if (switchcount == 0 && dir == "asc") 
        dir = "desc";
        switching = true;
      
    
  
  
  setCookie("sortBy", n, 30);
  setCookie("sortByDir", dir);



function setCookie(cname,cvalue,exdays) 
    var d = new Date();
    d.setTime(d.getTime() + (exdays*24*60*60*1000));
    var expires = "expires=" + d.toGMTString();
    document.cookie = cname + "=" + cvalue + ";" + expires + ";path=/";


function getCookie(cname) 
    var name = cname + "=";
    var decodedCookie = decodeURIComponent(document.cookie);
    var ca = decodedCookie.split(';');
    for(var i = 0; i < ca.length; i++) 
        var c = ca[i];
        while (c.charAt(0) == ' ') 
            c = c.substring(1);
        
        if (c.indexOf(name) == 0) 
            return c.substring(name.length, c.length);
        
    
    return "";


function checkCookie() 
    var sortBy=getCookie("sortBy");
    if (sortBy != "") 
        sortTable(parseInt(sortBy), getCookie("sortByDir"));
    

</script>

</body>
</html>

编辑: 再一个 sn-p 来使用 sessionStorage

<!DOCTYPE html>
<html>
<head>
<title>Sort a HTML Table Alphabetically</title>
<style>
table 
    border-spacing: 0;
    width: 100%;
    border: 1px solid #ddd;


th 
    cursor: pointer;


th, td 
    text-align: left;
    padding: 16px;


tr:nth-child(even) 
    background-color: #f2f2f2

</style>
</head>
<body onload="checkStrorage();">

<p><strong>Click the headers to sort the table.</strong></p>
<p>The first time you click, the sorting direction is ascending (A to Z).</p>
<p>Click again, and the sorting direction will be descending (Z to A):</p>

<table id="myTable">
  <tr>
   <!--When a header is clicked, run the sortTable function, with a parameter, 0 for sorting by names, 1 for sorting by country:-->  
    <th onclick="sortTable(0)">Name</th>
    <th onclick="sortTable(1)">Country</th>
  </tr>
  <tr>
    <td>Berglunds snabbkop</td>
    <td>Sweden</td>
  </tr>
  <tr>
    <td>North/South</td>
    <td>UK</td>
  </tr>
  <tr>
    <td>Alfreds Futterkiste</td>
    <td>Germany</td>
  </tr>
  <tr>
    <td>Koniglich Essen</td>
    <td>Germany</td>
  </tr>
  <tr>
    <td>Magazzini Alimentari Riuniti</td>
    <td>Italy</td>
  </tr>
  <tr>
    <td>Paris specialites</td>
    <td>France</td>
  </tr>
  <tr>
    <td>Island Trading</td>
    <td>UK</td>
  </tr>
  <tr>
    <td>Laughing Bacchus Winecellars</td>
    <td>Canada</td>
  </tr>
</table>

<script>
function sortTable(n, dir) 
  var table, rows, switching, i, x, y, shouldSwitch, dir, switchcount = 0;
  table = document.getElementById("myTable");
  switching = true;
  //Set the sorting direction to ascending:
  !dir && (dir = "asc"); 
  /*Make a loop that will continue until
  no switching has been done:*/
  while (switching) 
    //start by saying: no switching is done:
    switching = false;
    rows = table.getElementsByTagName("TR");
    /*Loop through all table rows (except the
    first, which contains table headers):*/
    for (i = 1; i < (rows.length - 1); i++) 
      //start by saying there should be no switching:
      shouldSwitch = false;
      /*Get the two elements you want to compare,
      one from current row and one from the next:*/
      x = rows[i].getElementsByTagName("TD")[n];
      y = rows[i + 1].getElementsByTagName("TD")[n];
      /*check if the two rows should switch place,
      based on the direction, asc or desc:*/
      if (dir == "asc") 
        if (x.innerHTML.toLowerCase() > y.innerHTML.toLowerCase()) 
          //if so, mark as a switch and break the loop:
          shouldSwitch= true;
          break;
        
       else if (dir == "desc") 
        if (x.innerHTML.toLowerCase() < y.innerHTML.toLowerCase()) 
          //if so, mark as a switch and break the loop:
          shouldSwitch= true;
          break;
        
      
    
    if (shouldSwitch) 
      /*If a switch has been marked, make the switch
      and mark that a switch has been done:*/
      rows[i].parentNode.insertBefore(rows[i + 1], rows[i]);
      switching = true;
      //Each time a switch is done, increase this count by 1:
      switchcount ++;      
     else 
      /*If no switching has been done AND the direction is "asc",
      set the direction to "desc" and run the while loop again.*/
      if (switchcount == 0 && dir == "asc") 
        dir = "desc";
        switching = true;
      
    
  
  
  sessionStorage.setItem('sortBy', n);
  sessionStorage.setItem('sortByDir', dir);


function checkStrorage() 
    var sortBy= sessionStorage.getItem('sortBy');
    if (sortBy !== null) 
        sortTable(parseInt(sortBy), sessionStorage.getItem('sortByDir'));
    

</script>

</body>
</html>

【讨论】:

谢谢。我想。但是使用 sessionStorage 而不是 cookie 更好吗?因为当页面关闭时,会话将清除该值,而 cookie 不会。 添加了另一个使用 sessionStorage 的 sn-p。决定哪个更好可以在这篇文章中看到 (***.com/questions/19867599/…) 请告诉我进展如何。如果一切正常,请选择我的答案来结束您的问题。 非常感谢!它确实有效!顺便说一句,我认为使用 sessionStorage 时没有使用 getStorage 函数。

以上是关于页面刷新后保留表格排序结果?的主要内容,如果未能解决你的问题,请参考以下文章

js查找数组中出现次数最多的元素

WPS excel可以只保留数字,把文字都删了么

用tablesorter排序后保留原来的顺序

jQuery插件 tablesorter 表格排序 使用说明

jQuery插件 tablesorter 表格排序 使用说明

解决element表格组件排序结果不正确问题