หมวดหมู่: jQuery

JavaScript: table reader อ่านตารางJavaScript: table reader อ่านตาราง

พอดีทำงานที่ต้องมีการเข้าไปอ่านตารางแล้วเอาค่าไปใช้ เลยเขียน code ให้ไปอ่านตารางวิธีเดียวกับที่คนใช้ เลยเขียน prototype ให้ dev, ba เข้าใจ โดยโปรแกรมตัวนี้บางคนจะเรียกว่า table reader, sequential table reader, Data extraction tool, Parsing, Data mining แต่ในความรู้สึกของผม มันคือ table reader
table_reader.html

<!DOCTYPE html>
<html lang="th">

<head>
 <meta charset="UTF-8">
 <meta name="viewport" content="width=device-width, initial-scale=1.0">
 <title>JavaScript: table reader</title>
 <link crossorigin="anonymous" referrerpolicy="no-referrer" rel="stylesheet"
 href="https://cdnjs.cloudflare.com/ajax/libs/bootstrap/5.3.3/css/bootstrap.min.css"
 integrity="sha512-jnSuA4Ss2PkkikSOLtYs8BlYIeeIK1h99ty4YfvRPAlzr377vr3CXDb7sb7eEEBYjDtcYj+AjBH3FLv5uSJuXg==" />
 <style>
 #rateTA td:nth-child (2) ,
 #rateTA td:nth-child (3) ,
 #rateTA td:nth-child (4) ,
 #rateTA td:nth-child (5) {
 text-align: right;
 }
 </style>
</head>

<body>
 <h2>TL Plan 20/10 (ผลตอบแทนสูงที่สุด) ไทยประกันชีวิต</h2>
 <p>ชำระเบี้ยเพียง 10 ปี (สามารถนำไปลดหย่อนภาษีได้) </p>
 <p>ติดต่อตัวแทนผมไม่ได้ขาย แต่ถ้าตัวแทนอยากได้เว็บก็โทรมา</p>
 <form class="text-end">
 <div class="row g-3 justify-content-end">
 <div class="col-auto">
 <label for="age" class="visually-hidden">อายุ</label>
 <input type="number" step="1" class="form-control" id="age" placeholder="อายุ">
 </div>
 <div class="col-auto">
 <label for="sex" class="visually-hidden">เพศ</label>
 <select class="form-select" id="sex">
 <option selected>เพศ</option>
 <option value="male">ชาย</option>
 <option value="female">หญิง</option>
 </select>
 </div>
 <div class="col-auto">
 <button id="submitBtn" type="submit" class="btn btn-primary mb-3">Submit</button>
 <button type="reset" class="btn btn-secondary mb-3">Reset</button>
 </div>
 </div>
 </form>
 <table class="table table-bordered table-striped" id="rateTA">
 <thead>
 <tr>
 <th>อายุ</th>
 <th colspan="2">อัตราเบี้ยประกัน</th>
 <th>ทุนประกันชีวิต</th>
 <th>เงินครบสัญญาปีที่ 20</th>
 <th>เงินคืนระหว่างปี</th>
 </tr>
 <tr>
 <th>เพศ</th>
 <th">ชาย</th>
 <th>หญิง</th>
 <th>คุ้มครองเสียชีวิตทุกกรณี</th>
 <th> (รับ 150% ของทุนประกัน) </th>
 <th>ไม่มี</th>
 </tr>
 </thead>
 <tbody>
 <tr>
 <td>0</td>
 <td>10,630</td>
 <td>10,630</td>
 <td>100,000</td>
 <td>150,000</td>
 <td>ไม่มี</td>
 </tr>
 <tr>
 <td>1</td>
 <td>10,560</td>
 <td>10,590</td>
 <td>100,000</td>
 <td>150,000</td>
 <td>ไม่มี</td>
 </tr>
 <tr>
 <td>2</td>
 <td>10,530</td>
 <td>10,570</td>
 <td>100,000</td>
 <td>150,000</td>
 <td>ไม่มี</td>
 </tr>
 <tr>
 <td>3</td>
 <td>10,510</td>
 <td>10,560</td>
 <td>100,000</td>
 <td>150,000</td>
 <td>ไม่มี</td>
 </tr>
 <tr>
 <td>4</td>
 <td>10,500</td>
 <td>10,550</td>
 <td>100,000</td>
 <td>150,000</td>
 <td>ไม่มี</td>
 </tr>
 <tr>
 <td>5</td>
 <td>10,490</td>
 <td>10,540</td>
 <td>100,000</td>
 <td>150,000</td>
 <td>ไม่มี</td>
 </tr>
 <tr>
 <td>6</td>
 <td>10,480</td>
 <td>10,540</td>
 <td>100,000</td>
 <td>150,000</td>
 <td>ไม่มี</td>
 </tr>
 <tr>
 <td>7</td>
 <td>10,480</td>
 <td>10,540</td>
 <td>100,000</td>
 <td>150,000</td>
 <td>ไม่มี</td>
 </tr>
 <tr>
 <td>8</td>
 <td>10,470</td>
 <td>10,540</td>
 <td>100,000</td>
 <td>150,000</td>
 <td>ไม่มี</td>
 </tr>
 <tr>
 <td>9</td>
 <td>10,460</td>
 <td>10,540</td>
 <td>100,000</td>
 <td>150,000</td>
 <td>ไม่มี</td>
 </tr>
 <tr>
 <td>10</td>
 <td>10,450</td>
 <td>10,540</td>
 <td>100,000</td>
 <td>150,000</td>
 <td>ไม่มี</td>

 </tr>
 <tr>
 <td>11</td>
 <td>10,440</td>
 <td>10,540</td>
 <td>100,000</td>
 <td>150,000</td>
 <td>ไม่มี</td>
 </tr>
 <tr>
 <td>12</td>
 <td>10,430</td>
 <td>10,540</td>
 <td>100,000</td>
 <td>150,000</td>
 <td>ไม่มี</td>
 </tr>
 <tr>
 <td>13</td>
 <td>10,420</td>
 <td>10,540</td>
 <td>100,000</td>
 <td>150,000</td>
 <td>ไม่มี</td>
 </tr>
 <tr>
 <td>14</td>
 <td>10,410</td>
 <td>10,540</td>
 <td>100,000</td>
 <td>150,000</td>
 <td>ไม่มี</td>
 </tr>
 <tr>
 <td>15</td>
 <td>10,400</td>
 <td>10,540</td>
 <td>100,000</td>
 <td>150,000</td>
 <td>ไม่มี</td>
 </tr>
 <tr>
 <td>16</td>
 <td>10,390</td>
 <td>10,540</td>
 <td>100,000</td>
 <td>150,000</td>
 <td>ไม่มี</td>
 </tr>
 <tr>
 <td>17</td>
 <td>10,380</td>
 <td>10,540</td>
 <td>100,000</td>
 <td>150,000</td>
 <td>ไม่มี</td>
 </tr>
 <tr>
 <td>18</td>
 <td>10,370</td>
 <td>10,540</td>
 <td>100,000</td>
 <td>150,000</td>
 <td>ไม่มี</td>
 </tr>
 <tr>
 <td>19</td>
 <td>10,360</td>
 <td>10,540</td>
 <td>100,000</td>
 <td>150,000</td>
 <td>ไม่มี</td>
 </tr>
 <tr>
 <td>20</td>
 <td>10,350</td>
 <td>10,540</td>
 <td>100,000</td>
 <td>150,000</td>
 <td>ไม่มี</td>
 </tr>
 <tr>
 <td>21</td>
 <td>10,340</td>
 <td>10,540</td>
 <td>100,000</td>
 <td>150,000</td>
 <td>ไม่มี</td>
 </tr>
 <tr>
 <td>22</td>
 <td>10,330</td>
 <td>10,540</td>
 <td>100,000</td>
 <td>150,000</td>
 <td>ไม่มี</td>
 </tr>
 <tr>
 <td>23</td>
 <td>10,320</td>
 <td>10,540</td>
 <td>100,000</td>
 <td>150,000</td>
 <td>ไม่มี</td>
 </tr>
 <tr>
 <td>24</td>
 <td>10,310</td>
 <td>10,540</td>
 <td>100,000</td>
 <td>150,000</td>
 <td>ไม่มี</td>
 </tr>
 <tr>
 <td>25</td>
 <td>10,300</td>
 <td>10,540</td>
 <td>100,000</td>
 <td>150,000</td>
 <td>ไม่มี</td>
 </tr>
 <tr>
 <td>26</td>
 <td>10,290</td>
 <td>10,540</td>
 <td>100,000</td>
 <td>150,000</td>
 <td>ไม่มี</td>
 </tr>
 <tr>
 <td>27</td>
 <td>10,280</td>
 <td>10,540</td>
 <td>100,000</td>
 <td>150,000</td>
 <td>ไม่มี</td>
 </tr>
 <tr>
 <td>28</td>
 <td>10,270</td>
 <td>10,540</td>
 <td>100,000</td>
 <td>150,000</td>
 <td>ไม่มี</td>
 </tr>
 <tr>
 <td>29</td>
 <td>10,260</td>
 <td>10,540</td>
 <td>100,000</td>
 <td>150,000</td>
 <td>ไม่มี</td>
 </tr>
 <tr>
 <td>30</td>
 <td>10,250</td>
 <td>10,540</td>
 <td>100,000</td>
 <td>150,000</td>
 <td>ไม่มี</td>
 </tr>
 <tr>
 <td>31</td>
 <td>10,240</td>
 <td>10,540</td>
 <td>100,000</td>
 <td>150,000</td>
 <td>ไม่มี</td>
 </tr>
 <tr>
 <td>32</td>
 <td>10,230</td>
 <td>10,540</td>
 <td>100,000</td>
 <td>150,000</td>
 <td>ไม่มี</td>
 </tr>
 <tr>
 <td>33</td>
 <td>10,220</td>
 <td>10,540</td>
 <td>100,000</td>
 <td>150,000</td>
 <td>ไม่มี</td>
 </tr>
 <tr>
 <td>34</td>
 <td>10,210</td>
 <td>10,540</td>
 <td>100,000</td>
 <td>150,000</td>
 <td>ไม่มี</td>
 </tr>
 <tr>
 <td>35</td>
 <td>10,200</td>
 <td>10,540</td>
 <td>100,000</td>
 <td>150,000</td>
 <td>ไม่มี</td>
 </tr>
 <tr>
 <td>36</td>
 <td>10,740</td>
 <td>10,570</td>
 <td>100,000</td>
 <td>150,000</td>
 <td>ไม่มี</td>
 </tr>
 <tr>
 <td>38</td>
 <td>10,740</td>
 <td>10,570</td>
 <td>100,000</td>
 <td>150,000</td>
 <td>ไม่มี</td>
 </tr>
 <tr>
 <td>39</td>
 <td>10,750</td>
 <td>10,570</td>
 <td>100,000</td>
 <td>150,000</td>
 <td>ไม่มี</td>
 </tr>
 <tr>
 <td>40</td>
 <td>10,750</td>
 <td>10,570</td>
 <td>100,000</td>
 <td>150,000</td>
 <td>ไม่มี</td>
 </tr>
 <tr>
 <td>41</td>
 <td>10,760</td>
 <td>10,570</td>
 <td>100,000</td>
 <td>150,000</td>
 <td>ไม่มี</td>
 </tr>
 <tr>
 <td>43</td>
 <td>10,780</td>
 <td>10,580</td>
 <td>100,000</td>
 <td>150,000</td>
 <td>ไม่มี</td>
 </tr>
 <tr>
 <td>44</td>
 <td>10,790</td>
 <td>10,580</td>
 <td>100,000</td>
 <td>150,000</td>
 <td>ไม่มี</td>
 </tr>
 <tr>
 <td>45</td>
 <td>10,800</td>
 <td>10,580</td>
 <td>100,000</td>
 <td>150,000</td>
 <td>ไม่มี</td>
 </tr>
 <tr>
 <td>46</td>
 <td>10,810</td>
 <td>10,580</td>
 <td>100,000</td>
 <td>150,000</td>
 <td>ไม่มี</td>
 </tr>
 <tr>
 <td>47</td>
 <td>10,820</td>
 <td>10,590</td>
 <td>100,000</td>
 <td>150,000</td>
 <td>ไม่มี</td>
 </tr>
 <tr>
 <td>48</td>
 <td>10,830</td>
 <td>10,590</td>
 <td>100,000</td>
 <td>150,000</td>
 <td>ไม่มี</td>
 </tr>
 <tr>
 <td>49</td>
 <td>10,840</td>
 <td>10,590</td>
 <td>100,000</td>
 <td>150,000</td>
 <td>ไม่มี</td>
 </tr>
 <tr>
 <td>50</td>
 <td>10,850</td>
 <td>10,590</td>
 <td>100,000</td>
 <td>150,000</td>
 <td>ไม่มี</td>
 </tr>
 <tr>
 <td>51</td>
 <td>10,860</td>
 <td>10,600</td>
 <td>100,000</td>
 <td>150,000</td>
 <td>ไม่มี</td>
 </tr>
 <tr>
 <td>52</td>
 <td>10,870</td>
 <td>10,600</td>
 <td>100,000</td>
 <td>150,000</td>
 <td>ไม่มี</td>
 </tr>
 <tr>
 <td>53</td>
 <td>10,880</td>
 <td>10,600</td>
 <td>100,000</td>
 <td>150,000</td>
 <td>ไม่มี</td>
 </tr>
 <tr>
 <td>54</td>
 <td>10,890</td>
 <td>10,610</td>
 <td>100,000</td>
 <td>150,000</td>
 <td>ไม่มี</td>
 </tr>
 <tr>
 <td>57</td>
 <td>10,920</td>
 <td>10,620</td>
 <td>100,000</td>
 <td>150,000</td>
 <td>ไม่มี</td>
 </tr>
 <tr>
 <td>58</td>
 <td>10,930</td>
 <td>10,620</td>
 <td>100,000</td>
 <td>150,000</td>
 <td>ไม่มี</td>
 </tr>
 <tr>
 <td>59</td>
 <td>10,940</td>
 <td>10,630</td>
 <td>100,000</td>
 <td>150,000</td>
 <td>ไม่มี</td>
 </tr>
 <tr>
 <td>65</td>
 <td>11,000</td>
 <td>10,660</td>
 <td>100,000</td>
 <td>150,000</td>
 <td>ไม่มี</td>
 </tr>
 <tr>
 <td>55</td>
 <td>10,900</td>
 <td>10,610</td>
 <td>100,000</td>
 <td>150,000</td>
 <td>ไม่มี</td>
 </tr>
 <tr>
 <td>66</td>
 <td>11,010</td>
 <td>10,660</td>
 <td>100,000</td>
 <td>150,000</td>
 <td>ไม่มี</td>
 </tr>
 <tr>
 <td>67</td>
 <td>11,020</td>
 <td>10,670</td>
 <td>100,000</td>
 <td>150,000</td>
 <td>ไม่มี</td>
 </tr>
 <tr>
 <td>68</td>
 <td>11,030</td>
 <td>10,670</td>
 <td>100,000</td>
 <td>150,000</td>
 <td>ไม่มี</td>
 </tr>
 <tr>
 <td>60</td>
 <td>10,950</td>
 <td>10,630</td>
 <td>100,000</td>
 <td>150,000</td>
 <td>ไม่มี</td>
 </tr>
 <tr>
 <td>62</td>
 <td>10,970</td>
 <td>10,640</td>
 <td>100,000</td>
 <td>150,000</td>
 <td>ไม่มี</td>
 </tr>
 <tr>
 <td>63</td>
 <td>10,980</td>
 <td>10,650</td>
 <td>100,000</td>
 <td>150,000</td>
 <td>ไม่มี</td>
 </tr>
 <tr>
 <td>56</td>
 <td>10,910</td>
 <td>10,610</td>
 <td>100,000</td>
 <td>150,000</td>
 <td>ไม่มี</td>
 </tr>
 <tr>
 <td>69</td>
 <td>11,040</td>
 <td>10,680</td>
 <td>100,000</td>
 <td>150,000</td>
 <td>ไม่มี</td>
 </tr>
 <tr>
 <td>70</td>
 <td>11,060</td>
 <td>10,690</td>
 <td>100,000</td>
 <td>150,000</td>
 <td>ไม่มี</td>
 </tr>
 </tbody>
 <tfoot>
 <tr class="footer-row">
 <th colspan="6">*หมายเหตุ: ทุนประกันเพิ่มขึ้นเมื่อมูลค่าเงินสดเพิ่มขึ้น</th>
 </tr>
 <tr class="footer-row">
 <th colspan="6">*หมายเหตุ: ผลตอบแทนมากกว่าเงินฝากประจำ</th>
 </tr>
 </tfoot>
 </table>
 <script>
 const submitBtn = document.getElementById ('submitBtn') ;
 let cellHeaderOld;
 let cellOld;
 let colIndex = 0;
 let interval = 1000; // 1 seconds
 let table = document.getElementById ('rateTA') ;

 function tableReader () {
 if (colIndex >= table.querySelectorAll ('thead th') .length) {
 alert ('End of table') ;
 return; // Stop if we've reached the end of columns
 }

 let cellHeader = table.querySelectorAll ('thead th') [colIndex];
 let tbodyRows = table.querySelectorAll ('tbody tr') ;
 let tbodyCells = Array.from (tbodyRows) .map (row => row.querySelectorAll ('td') [colIndex]) ;

 // Highlight the header cell
 if (cellHeaderOld) {
 cellHeaderOld.classList.remove ('table-primary') ;
 }
 cellHeader.classList.add ('table-primary') ;
 cellHeaderOld = cellHeader;

 // Test condition in tbody
 tbodyCells.forEach ( (cell, index) => {
 setTimeout ( () => {
 if (cellOld) {
 cellOld.classList.remove ('table-primary') ;
 }
 cell.classList.add ('table-primary') ;
 cellOld = cell;
 }, interval * (index + 1)) ;
 }) ;

 // Move to the next column after highlighting all cells in the current column
 setTimeout (function () {
 colIndex++;

 tableReader () ;

 }, interval * (tbodyCells.length + 1)) ;

 }

 submitBtn.addEventListener ('click', function (e) {
 e.preventDefault () ;

 let table = document.getElementById ('rateTA') ;

 tableReader (table) ;
 }) ;
 </script>
</body>

</html>