HTML table 的交互式过滤器,动态加载来自 JSON url 的数据

Interactive filter for HTML table with dynamically loaded data from JSON url

01) 我将数据从 JSON url 动态加载到 HTML table 中。

02) 我使用页面顶部的过滤器过滤结果。

03) 我从同一个 JSON url 动态加载过滤器中的数据。

04) 我将代码粘贴到下面的代码片段中(它不会加载 JSON 数据,因为 url 包含 https。我创建它只是为了让你看到代码。过滤器在这里不起作用。

$.getJSON(
     'http://apolosiskos.co.uk/TEB/MOCK_DATA.json',
     function(data){
         var tr;
         $.each (data, function (key, val) {
            tr = $('<tr/>');
            tr.append('<td class="name" rel="' + val.first_name + '">' + val.first_name + '</td>');
            tr.append('<td ><input class="metric1"/>' + '</td>');
            tr.append('<td class="metric2" >' + val.id + '</td>');
            tr.append('<td class="metric3"><span class="multTotal">' +'0.00'+ '</span></td>');
     tr.append('<td class="metric3-100"><span class="metric3-100">' +'0.00'+ '</span></td>');
     tr.append('<td class="metric1-100"><span class="metric1-100">' +'0.00'+ '</span></td>');
            $('table').append(tr);
         });

         $.each (data, function (key, val) {
            li = $('<li/>');
            li.append('<input rel="name" type="checkbox" value="' + val.first_name + '"><label for="cb1">' + val.first_name + '</label></li>');
            $('ul').append(li);
         });

       $("input").keyup(multInputs);
       });

$("input:checkbox").click(function () {
    var showAll = true;
    $('tr').not('.first').hide();
    $('input[type=checkbox]').each(function () {
        if ($(this)[0].checked) {
            showAll = false;
            var dimension1= $(this).attr('rel');
            var value = $(this).val();            
            $('td.' + dimension1+ '[rel="' + value + '"]').parent('tr').show();
        }
    });
    if(showAll){
        $('tr').show();
    }
});
h1{
  font-size: 30px;
  color: #fff;
  text-transform: uppercase;
  font-weight: 300;
  text-align: center;
  margin-bottom: 15px;
}
table{
  width:100%;
  table-layout: fixed;
}
.tbl-header{
  background-color: rgba(255,255,255,0.3);
 }
.tbl-content{
  height:300px;
  overflow-x:auto;
  margin-top: 0px;
}

th{
  padding: 20px 15px;
  text-align: left;
  font-weight: 500;
  font-size: 12px;
  color: #fff;
  text-transform: uppercase;
}
td{
  padding: 10px;
  text-align: left;
  vertical-align:middle;
  font-weight: 300;
  font-size: 12px;
  color: #fff;

}

tr:nth-child(odd) td {
  background:#2cc3ce;
  color:#0d3852;
}

/* demo styles */

@import url(http://fonts.googleapis.com/css?family=Roboto:400,500,300,700);
body{
  background: #0d3852;
  font-family: 'Roboto', sans-serif;
}
section{
  margin: 50px;
}

input {
max-width:50px;
}

*,
*:after,
*::before {
    -webkit-box-sizing: border-box;
    -moz-box-sizing: border-box;
    box-sizing: border-box;
}

.ac-custom {
 padding: 0 1em;
 max-width: 900px;
 margin: 0 auto;
}

.ac-custom h2 {
 font-size: 1em;
 font-weight: 300;
 padding: 0 0 0.5em;
 margin: 0 0 30px;
 color:#0d3852;
}

.ac-custom ul,
.ac-custom ol {
 list-style: none;
 padding: 0;
 margin: 0 auto;
 max-width: 800px;
}

.ac-custom li {
 margin: 0 auto;
 padding: 0.5em 0;
 position: relative;
}

.ac-custom label {
 display: inline-block;
 position: relative;
 font-size: 1em;
 padding: 0 0 0 80px;
 vertical-align: top;
 color: #0d3852;
 cursor: pointer;
 -webkit-transition: color 0.3s;
 transition: color 0.3s;
}

.ac-custom input[type="checkbox"],
.ac-custom input[type="radio"],
.ac-custom label::before {
 width: 20px;
 height: 20px;
 top: 50%;
 left: 0;
 margin-top: -12px;
 position: absolute;
 cursor: pointer;
}

.ac-custom input[type="checkbox"],
.ac-custom input[type="radio"] {
 opacity: 0;
 -webkit-appearance: none;
 display: inline-block;
 vertical-align: middle;
 z-index: 100;
}

.ac-custom label::before {
 content: '';
 border: 1px solid #0d3852;
 -webkit-transition: opacity 0.3s;
 transition: opacity 0.3s;
}

.ac-radio label::before {
 border-radius: 50%;
}

.ac-custom input[type="checkbox"]:checked + label,
.ac-custom input[type="radio"]:checked + label {
 color: #fff;
} 

.ac-custom input[type="checkbox"]:checked + label::before,
.ac-custom input[type="radio"]:checked + label::before {
 opacity: 0.8;
}

/* General SVG and path styles */

.ac-custom svg {
 position: absolute;
 width: 20px;
 height: 20px;
 top: 50%;
 margin-top: -12px;
 left: 0px;
 pointer-events: none;
}

.ac-custom svg path {
 stroke: #0d3852;
 stroke-width: 13px;
 stroke-linecap: round;
 stroke-linejoin: round;
 fill: none;
}

/* Specific input, SVG and path styles */

/* Circle */
.ac-circle input[type="checkbox"],
.ac-circle input[type="radio"],
.ac-circle label::before {
 width: 30px;
 height: 30px;
 margin-top: -15px;
 left: 10px;
 position: absolute;
}

.ac-circle label::before {
 background-color: #fff;
 border: none;
}

.ac-circle svg {
 width: 70px;
 height: 70px;
 margin-top: -35px;
 left: -10px;
}

.ac-circle svg path {
 stroke-width: 5px;
} 

/* Box Fill */
.ac-boxfill svg path {
 stroke-width: 8px;
} 

/* Swirl */
.ac-swirl svg path {
 stroke-width: 8px;
}

/* List */
.ac-list ol {
 list-style: decimal;
 list-style-position: inside;
}

.ac-list ol li {
 font-size: 2em;
 padding: 1em 1em 0 2em;
 text-indent: -40px;
}

.ac-list ol li label {
 font-size: 0.5em;
 text-indent: 0;
 padding-left: 30px;
}

.ac-list label::before {
 display: none;
}

.ac-list svg {
 width: 100%;
 height: 80px;
 left: 0;
 top: 1.2em;
 margin-top: 0px;
}

.ac-list svg path {
 stroke-width: 4px;
}

.row {
  margin-left: -15px;
  margin-right: -15px;
  margin-top:0;
}
.col-sm-4 {
  position: relative;
  min-height: 1px;
  padding-left: 15px;
  padding-right: 15px;
  padding-bottom: 30px;
}

@media (min-width: 768px) {
  .col-sm-4 {
    float: left;
  }

  .col-sm-4 {
    width: 33.33333333%;
  } 
 
 .filter-columns {
 background-color:#2cc3ce;
 }
 
 .filter-columns-alt {
 background-color:#78D9E0;
 min-height:256px;
 }
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
  <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.4/jquery.min.js"></script>
  <script src="js/svgcheckbx.js"></script>
  <script src="js/jquery.dataTables.min.js"></script>
  <script type="text/javascript" language="javascript" src="js/allinone.js"></script>
<div class="row">
  <div class="col-sm-4 filter-columns">
   <div class="ac-custom ac-checkbox ac-cross" autocomplete="off">
    <h2>Dimension1</h2>
    <ul>
     <li><input rel="name" type="checkbox" value="Debra"><label for="cb1">Debra</label></li>
     <li><input rel="name" type="checkbox" value="Julie"><label for="cb1">Julie</label></li>
     <li><input rel="name" type="checkbox" value="Norma"><label for="cb1">Norma</label></li>
     <li><input rel="name" type="checkbox" value="Bobby"><label for="cb1">Bobby</label></li>
     <li><input rel="name" type="checkbox" value="Henry"><label for="cb1">Henry</label></li>
    </ul>
   </div>
  </div>
  
  <div id="body">
    

<table>
    <tr id="ProductID" class="first">
        <th>NAME</th>
        <th>INPUT</th>
        <th>MAIN VALUE</th>
        <th>DIFF</th>
 <th>DIFF /100</th>
        <th>MV /100</th>
    </tr>
</table>
</div>

05) 如果我将静态数据放入其中,过滤器就会工作。

所以,在 HTML 代码中,我在过滤器部分放置了这个:

<ul>
    <li><input rel="name" type="checkbox" value="Debra"><label for="cb1">Debra</label></li>
    <li><input rel="name" type="checkbox" value="Julie"><label for="cb1">Julie</label></li>
    <li><input rel="name" type="checkbox" value="Norma"><label for="cb1">Norma</label></li>
    <li><input rel="name" type="checkbox" value="Bobby"><label for="cb1">Bobby</label></li>
    <li><input rel="name" type="checkbox" value="Henry"><label for="cb1">Henry</label></li>
</ul>

然后过滤器工作正常。我猜问题出在 JS 代码中。
我想在加载 JSON 数据的第一个函数中,我必须替换此行才能触发第二个函数:

UPD:代码如下所示:

$.getJSON(
     'http://apolosiskos.co.uk/TEB/MOCK_DATA.json',
     function(data){
         var tr;
         $.each (data, function (key, val) {
            tr = $('<tr/>');
            tr.append('<td class="name" rel="' + val.first_name + '">' + val.first_name + '</td>');
            tr.append('<td ><input class="metric1"/>' + '</td>');
            tr.append('<td class="metric2" >' + val.id + '</td>');
            tr.append('<td class="metric3"><span class="multTotal">' +'0.00'+ '</span></td>');
        tr.append('<td class="metric3-100"><span class="metric3-100">' +'0.00'+ '</span></td>');
        tr.append('<td class="metric1-100"><span class="metric1-100">' +'0.00'+ '</span></td>');
            $('table').append(tr);
         });

         $.each (data, function (key, val) {
            li = $('<li/>');
            li.append('<input rel="name" type="checkbox" value="' + val.first_name + '"><label for="cb1">' + val.first_name + '</label></li>');
            $('ul').append(li);
         });
       });

$('body').on('input', 'input:checkbox', filters);

function filters(){
    var showAll = true;
    $('tr').not('.first').hide();
    $('input[type=checkbox]').each(function () {
        if ($(this)[0].checked) {
            showAll = false;
            var dimension1= $(this).attr('rel');
            var value = $(this).val();            
            $('td.' + dimension1+ '[rel="' + value + '"]').parent('tr').show();
        }
    });
    if(showAll){
        $('tr').show();
    }
};

$("input:checkbox").click(filters);

您应该使用事件委托 on() 来跟踪动态添加到 DOM 的新输入:

$('body').on('keyup', 'input', multInputs);

你也可以使用input事件更好:

$('body').on('input', 'input', multInputs);

希望对您有所帮助。