2017-12-26 3 views
1

私はw3.js(https://www.w3schools.com/howto/howto_js_sort_table.asp)のテーブルソーターを使用しています。
また、データを更新するためにsetTimeoutを使用して1分間にページを更新しました。
ページを更新した後にソート結果を保持したい。
私は、メソッドがsessionStorageを使用していることを知っていますが、それを使用する方法はわかりません。
誰でも私にいくつかのヒントを教えてもらえますか?ページリフレッシュ後にテーブルソート結果を保持しますか?

+0

をのsessionStorageを使用する もう一つのスニペットを使用すると、ときにページ/テーブルのロードsortTable()を呼び出すことがOKか? – orabis

+0

申し訳ありませんが、私は2番目の例を使用していると言いました。それは各列に異なる数を与える。どうすればいいですか? – cyt

+0

以下にスニペットを追加しました。 – orabis

答えて

1

以下は、例の更新スニペットをSortTableにしたものです。我々は、ブラウザのクッキーを使用して、主にソートの列と方向である最後のソート情報を復元します。 W3Schoolにはもう1つの例があり、Cookie処理(Cookies)があります。下のスニペットは、クロスオリジンのポリシーのためウェブサイトでは機能しません。確かに、リファクタリングも必要ですが、それはスタートです。

<!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>

編集:代わりに

<!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>

+0

ありがとうございます。私はしようとしています。しかし、クッキーの代わりにsessionStorageを使用する方が良いでしょうか?クッキーは表示されませんが、ページを閉じると、セッションは値をクリアします。 – cyt

+0

代わりにsessionStorageを使用する別のスニペットが追加されました。どちらが良いかを決めることはこの投稿で見ることができます(https://stackoverflow.com/questions/19867599/what-is-the-difference-between-localstorage-sessionstorage-session-and-cookies) – orabis

+0

私にそれをどう教えてください行った。すべてが問題ない場合は、私の答えを選択して質問を終了してください。 – orabis

関連する問題