You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过Ajax传递选中分类复选框ID并实现子分类按需显隐

问题描述

已实现勾选分类复选框时,将分类ID通过Ajax传递并在当前页面显示对应子分类,但存在以下问题:勾选多个分类后取消其中一个时,所有子分类都会被隐藏。需要实现取消某个分类时,仅隐藏该分类对应的子分类。


原代码展示

原Ajax代码

<script>
function showUser(str) {
  if (str == "") {
    document.getElementById("txtHint").innerHTML = "";
    return;
  } else {
    var xmlhttp = new XMLHttpRequest();
    xmlhttp.onreadystatechange = function() {
      if (this.readyState == 4 && this.status == 200) {
        document.getElementById("txtHint").innerHTML += this.responseText;
      }
    };
    xmlhttp.open("POST","getsubcat.php?q="+str,true);
    xmlhttp.send();
  }
}
</script>

原jQuery代码

<script>
$(function() {
  $('input[type=checkbox]').on('change', function() {
    if($(this).is(':checked')) {
      showUser($(this).val());
    } else {
      showUser("");
    }
  });
});
</script>

原分类复选框代码

<?php
foreach($cat as $row)
{
?> 
<input class = "messageCheckbox" type = "checkbox" id = "check" value = "<?php echo $row["id"]; ?>">
<label for = "check"><?php echo $row["name"]; ?></label>
<?php
}
?>
<br>
<div id="txtHint"><b></b></div>

原getsubcat.php代码

<?php
$q = intval($_GET['q']);
$result = $link->query("SELECT * FROM subcat WHERE cat_id = '".$q."'");
?>
<div class = "checkbox">
<?php
while($row = mysqli_fetch_array($result)) {
?>
<input type="checkbox" id="sub_cat" name="sub_cat" value="<?php echo $row['subcat']; ?>">
<label for="sub_cat"> <?php echo $row['subcat'];  ?></label><br>
<?php 
}
?>
</div>

解决方案

核心思路是给每个分类对应的子分类容器添加唯一标识,取消勾选时精准定位并移除对应容器,而非清空所有内容。

1. 修复getsubcat.php:返回带分类ID标识的容器

让子分类外层容器绑定对应分类ID,同时修复SQL注入风险:

<?php
$q = intval($_GET['q']);
// 使用预处理语句防止SQL注入
$stmt = $link->prepare("SELECT * FROM subcat WHERE cat_id = ?");
$stmt->bind_param("i", $q);
$stmt->execute();
$result = $stmt->get_result();
?>
<!-- 添加分类ID作为容器唯一标识 -->
<div class="subcat-container" id="subcat-<?php echo $q; ?>">
  <?php
  while($row = mysqli_fetch_array($result)) {
  ?>
  <input type="checkbox" id="sub_cat_<?php echo $row['id']; ?>" name="sub_cat[]" value="<?php echo $row['subcat']; ?>">
  <label for="sub_cat_<?php echo $row['id']; ?>"><?php echo $row['subcat']; ?></label><br>
  <?php 
  }
  ?>
</div>

2. 修改Ajax函数:精准插入子分类容器

避免重复添加,仅在容器不存在时插入内容:

<script>
function showUser(catId) {
  if (catId == "") return;
  
  var xmlhttp = new XMLHttpRequest();
  xmlhttp.onreadystatechange = function() {
    if (this.readyState == 4 && this.status == 200) {
      var parentContainer = document.getElementById("txtHint");
      var existingSubcat = document.getElementById("subcat-" + catId);
      // 仅当容器不存在时添加
      if (!existingSubcat) {
        parentContainer.insertAdjacentHTML('beforeend', this.responseText);
      }
    }
  };
  xmlhttp.open("GET","getsubcat.php?q="+catId,true);
  xmlhttp.send();
}
</script>

3. 修改jQuery事件:取消勾选时移除对应子容器

直接根据分类ID定位并删除对应子分类容器:

<script>
$(function() {
  $('input.messageCheckbox').on('change', function() {
    var catId = $(this).val();
    if($(this).is(':checked')) {
      showUser(catId);
    } else {
      // 移除当前分类对应的子容器
      $("#subcat-" + catId).remove();
    }
  });
});
</script>

4. 修正分类复选框的ID唯一性问题

原代码中复选框ID重复,不符合HTML规范,改为带分类ID的唯一值:

<?php
foreach($cat as $row)
{
?> 
<input class="messageCheckbox" type="checkbox" id="check-<?php echo $row["id"]; ?>" value="<?php echo $row["id"]; ?>">
<label for="check-<?php echo $row["id"]; ?>"><?php echo $row["name"]; ?></label>
<?php
}
?>
<br>
<div id="txtHint"><b></b></div>

内容的提问来源于stack exchange,提问作者Pirah Bughio

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 14:37:06