即使在 AJAX 加载时,也会根据复选框状态隐藏 table tr

Hide table tr based in checkbox status even on AJAX load

我想隐藏 table tr 其中tr>td class status-locked , 如果复选框被选中.

我有一个 table 看起来像这样。它使用 Ajax loader 从数据库加载数据,因此如果它的产品超过 4 个,就会有第 2 页 link。如果单击第 2 页 link,它会使用 AJAX 加载数据。 table 仅根据 AJAX 从数据库加载数据获取新数据。

<input type="checkbox" id="product-toggle"  style="border: 1px  #000; background-color: #000;">

<table>
  <tr>
    <td class="status-locked">text</td>
    <td>text</td>
    <td>text</td>
    <td class="status-locked">text</td>
  </tr>
</table>
<button>1</button> <button>2</button>

现在我使用 jquery 来隐藏 tr 和具有 class="status-locked"td 并且它有效。

$(document).ready(function () {
$('#product-toggle').change(function(){
  if($(this).prop("checked")) {
     $('tr:has(td.status-locked)').hide();
  } else {
    $('tr:has(td.status-locked)').show();
  }
});
});
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="utf-8">
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
  </head>
 <body> 
<input type="checkbox" id="product-toggle"  style="border: 1px  #000; background-color: #000;">

    <table>
      <tr>
        <td>hide</td>
        <td>hide</td>
        <td>hide</td>
        <td class="status-locked">hide</td>
      </tr>
      <tr>
        <td>text</td>
        <td>text</td>
        <td>text</td>
        <td>text</td>
      </tr>
      <tr>
        <td>hide</td>
        <td>hide</td>
        <td>hide</td>
        <td class="status-locked">hide</td>
      </tr>
    </table>
    <button>1</button> <button>2</button>
</body>
</html>

问题 是如果 AJAX 从 database 加载新数据并且复选框被选中 tr>td>class="status-locked" 显示?

我希望隐藏带有 tdclass="status-locked"tr,除非未选中复选框。

此 Jquery 适用于页面刷新但不适用于 AJAX table 加载:

$(function(){        
$('#product-toggle')
  .prop('checked', localStorage.input === 'true')
  .on('change', function() {
     localStorage.input = this.checked;
     if (localStorage.input === 'true') {
       $('tr:has(td.status-locked)').hide();
     } 
  })
  .trigger('change');
});

您没有在选择器中选择 td 元素。尝试使用 $('tr td.status-locked')

$(document).ready(function () {
$('#product-toggle').change(function(){
  if($(this).prop("checked")) {
     $('tr td.status-locked').hide();
  } else {
    $('tr td.status-locked').show();
  }
});
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
<input type="checkbox" id="product-toggle">
    <table>
      <tr>
        <td>hide</td>
        <td>hide</td>
        <td>hide</td>
        <td class="status-locked">hide</td>
      </tr>
      <tr>
        <td>text</td>
        <td>text</td>
        <td>text</td>
        <td>text</td>
      </tr>
      <tr>
        <td>hide</td>
        <td>hide</td>
        <td>hide</td>
        <td class="status-locked">hide</td>
      </tr>
    </table>
    <button>1</button> <button>2</button>

只有当复选框发生变化时,您的功能才会被触发。如果你想解决你的问题,你需要在你的 javascript 中写这样的东西:`

$(document).ready(function () {
    hideShowRow();
    $('#product-toggle').change(function(){
      hideShowRow();
    });
});
function hideShowRow(){
      if($(this).prop("checked")) {
         $('tr:has(td.status-locked)').hide();
      } else {
        $('tr:has(td.status-locked)').show();
      }
}

` ... 这样您就可以随时调用您的函数 hideShowRow()。您可以在 document.ready、ajax.success 或任何您想要的地方调用它

尝试像这样分离逻辑:

$( document ).ready(function () {
    toggleRow();
    $('#product-toggle').on('change', toggleRow);
});

function toggleRow() {
    if( $('#product-toggle').prop("checked") ) {
         $('tr:has(td.status-locked)').hide();
    } else {
        $('tr:has(td.status-locked)').show();
    }
}

然后使用将在每个 ajax 请求后调用的 .ajaxComplete() 方法:

$( document ).ajaxComplete(function() {
  toggleRow();
});