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

如何使用jQuery控制PHP动态生成的div按对应单选按钮选择显隐

问题根因

  • 循环生成的DOM元素存在重复ID,HTML规范要求ID全局唯一,使用ID选择器绑定事件只会生效在第一个匹配的元素上
  • 原有DOM查找逻辑错误:next() 只能匹配当前元素的直接同级节点,单选按钮嵌套在容器内部,和下方需要控制显隐的div不存在直接同级关系,导致选择范围异常,作用到所有匹配的div上

第一步:修复PHP代码的重复ID问题

把循环内的ID都加上循环索引$i保证全局唯一,关键修改部分如下:

<?php for ($i = 0; $i < $data['partsCount']; $i++) :?>
<!-- 前面的代码保持不变 -->
<div class="row">
    <div class="col">
        <div class="custom-control custom-radio custom-control-inline">
            <!-- 单选ID加上索引 -->
            <input type="radio" id="status1-<?php echo $i; ?>" name="status[]" class="custom-control-input" value="2" checked>
            <label class="custom-control-label" for="status1-<?php echo $i; ?>">Aprovado</label>
        </div>
        <div class="custom-control custom-radio custom-control-inline">
            <input type="radio" id="status2-<?php echo $i; ?>" name="status[]" class="custom-control-input" value="3">
            <label class="custom-control-label" for="status2-<?php echo $i; ?>">Reprovado</label>
        </div>
    </div>
</div>
<div id="rejected-<?php echo $i; ?>" class="row my-4">
    <div class="col">
        <label for="desc">Motivo para a não aprovação do orçamento</label>
        <!-- 编辑器ID加上索引 -->
        <textarea name="reject_notes[]" id="editor1-<?php echo $i; ?>" class="form-control form-control-lg <?php echo (!empty($data['text_err'])) ? 'is-invalid' : ''; ?>" cols="80" rows="10"></textarea>
    </div>
</div>
<div id="accepted-<?php echo $i; ?>" class="row my-4">
    <div class="col-4">
        <label for="data_out">Data de Entrega</label>
        <div class="form-group">
            <div class="input-group input-group-lg date">
                <input type="text" name="delivery_date[]" class="form-control datetimepicker-input" id="datetimepicker<?php echo $i; ?>" />
                <div class="input-group-append">
                    <div class="input-group-text"><i class="fa fa-calendar"></i></div>
                </div>
            </div>
        </div>
    </div>
    <div class="col-12">
        <label for="desc">Caminho para as artes</label>
        <input type="text" class="form-control" name="path_files[]" id="">
        <label for="desc">Caminho para a PM/RM</label>
        <input type="text" class="form-control" name="path_pm[]" id="">
        <label for="desc" class="mt-3">Descritivo e orientações de criação</label>
        <!-- 编辑器ID加上索引 -->
        <textarea name="accept_notes[]" id="editor2-<?php echo $i; ?>" class="form-control form-control-lg <?php echo (!empty($data['text_err'])) ? 'is-invalid' : ''; ?>" cols="80" rows="10"></textarea>
    </div>
</div>
<?php endfor;?>

第二步:替换原有jQuery代码

改用类选择器绑定事件,通过DOM相对查找定位当前区块需要控制的div:

// 页面初始化:默认隐藏所有驳回区块
$('div[id^=rejected]').hide();

// 绑定所有单选按钮的change事件
$('input[name="status[]"]').change(function () {
    // 找到当前单选所在的行容器
    const $currentRadioRow = $(this).closest('.row');
    // 查找当前行后面同级的对应显隐区块
    const $rejectedBlock = $currentRadioRow.nextAll('div[id^=rejected]:first');
    const $acceptedBlock = $currentRadioRow.nextAll('div[id^=accepted]:first');
    
    // 根据选中值切换显隐
    if ($(this).val() == '2') {
        $acceptedBlock.show('slow');
        $rejectedBlock.hide('slow');
    } else if ($(this).val() == '3') {
        $acceptedBlock.hide('slow');
        $rejectedBlock.show('slow');
    }
});

修改后会根据点击的单选按钮,仅查找当前区块对应的两个控制div,不会影响其他循环生成的区块,同时修复了重复ID的HTML规范问题,避免后续其他功能出现异常。

内容的提问来源于stack exchange,提问作者Dani Drummond

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.14 23:15:03