返回

PHP 循环中如何单独运行 Bootstrap 模态框的 jQuery 函数?

php

在 PHP 循环中单独运行 Bootstrap 模态框的 jQuery 函数

当使用 PHP 循环在页面上生成多个模态框时,需要单独触发每个模态框的 jQuery 函数,以实现各自独特的行为。本文将深入探讨如何实现这一目标,解决困扰许多开发者的常见问题。

问题陈述

假设你有一个 PHP 循环,用于生成一个用户列表,并且每个用户都对应着一个 Bootstrap 模态框。当你选择模态框中的下拉菜单时,没有任何动作发生。你的目标是根据下拉菜单的值,在每个模态框中显示特定字段。此外,你还在模态框中使用 Select2 库创建了选择标记,但这些标记也无法正常工作。

解决方案

要解决此问题,需要遵循以下步骤:

1. 确保唯一的标识符

为每个模态框和相关的元素分配唯一的标识符至关重要。从代码中可以看出,模态框的 ID 都以 "test-" 和用户 ID 为前缀。此外,每个下拉菜单和表单的 ID 也应具有唯一的名称,如 "choices-user_id" 和 "new_test-user_id"。

2. 针对每个模态框编写 jQuery

在 jQuery 代码块中,使用 .each() 方法遍历每个用户,并为每个模态框附加事件监听器。

$(document).ready(function () {
    <?php foreach ($users as $user): ?>
    $('#choices-<?php echo $user->id; ?>').on('change', function (e) {
        e.preventDefault();
        const relatedOption = $('#choices-<?php echo $user->id; ?> option:selected').val();
        if (relatedOption !== '') {
            $('.relation_fields-<?php echo $user->id; ?>').slideDown();
        } else {
            $('.relation_fields-<?php echo $user->id; ?>').slideUp();
        }
        if (relatedOption === 'one') {
            $('#one_search-<?php echo $user->id; ?>').css('display', 'block');
        } else {
            $('#one_search-<?php echo $user->id; ?>').css('display', 'none');
        }
        if (relatedOption === 'two') {
            $('#two_search-<?php echo $user->id; ?>').css('display', 'block')
        } else {
            $('#two_search-<?php echo $user->id; ?>').css('display', 'none')
        }
        if (relatedOption === 'three') {
            $('#three_search-<?php echo $user->id; ?>').css('display', 'block');
        } else {
            $('#three_search-<?php echo $user->id; ?>').css('display', 'none');
        }
    });
    <?php endforeach; ?>
});

3. 使用唯一标识符选择元素

在 jQuery 代码中,使用唯一的标识符来选择模态框和相关的元素。确保 #choices-.relation_fields-#one_search- 以及其他元素的 ID 与 PHP 代码中的一致。

4. 初始化 Select2 库

对于每个模态框,初始化 Select2 库以增强选择标记的功能。

<?php foreach ($users as $user): ?>
$('#one_search_list-<?php echo $user->id; ?>').select2();
$('#two_search_list-<?php echo $user->id; ?>').select2();
$('#three_search_list-<?php echo $user->id; ?>').select2();
<?php endforeach; ?>

5. 完整的代码示例

将以下代码添加到你的 PHP 循环中,以实现每个模态框的独立运行:

<?php foreach ( $users as $user ): ?>
    <div class="modal fade" id="test-<?php echo $user->id ?>" data-bs-backdrop="static" data-bs-keyboard="false"
         tabindex="-1" aria-labelledby="staticBackdropLabel" aria-hidden="true">
        <div class="modal-dialog modal-dialog-centered modal-xl">
            <div class="modal-content">
                <div class="modal-header">
                    <h1 class="modal-title fs-5" id="staticBackdropLabel">modal</h1>
                    <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
                </div>
                <div class="modal-body">
                    <form method="post" id="new_test<?php echo $user->id ?>" class="new_test_modal">
                        <div class="row mb-3">
                            <div class="col-lg-6 col-md-6 col-sm-12">
                                <select class="form-select" id="choices-<?php echo $user->id; ?>">
                                    <option value="">numbers</option>
                                    <option value="one">01</option>
                                    <option value="two">02</option>
                                    <option value="three">03</option>
                                </select>
                            </div>
                            <div class="col-lg-6 col-md-6 col-sm-12 relation_fields-<?php echo $user->id; ?>"
                                 style="display: none">
                                <div class="col-12" id="one_search-<?php echo $user->id; ?>" style="display: none">
                                    <select name="one_search_list" id="one_search_list-<?php echo $user->id; ?>"
                                            class="form-control"></select>
                                </div>
                                <div class="col-12" id="two_search-<?php echo $user->id; ?>" style="display: none">
                                    <select name="two_search_list" id="two_search_list-<?php echo $user->id; ?>"
                                            class="form-control"></select>
                                </div>
                                <div class="col-12" id="three_search-<?php echo $user->id; ?>" style="display: none">
                                    <select name="three_search_list" id="three_search_list-<?php echo $user->id; ?>"
                                            class="form-control"></select>
                                </div>
                            </div>
                        </div>
                    </form>
                </div>
            </div>
        </div>
    </div>
<?php endforeach; ?>
<script>
    $(document).ready(function () {
        <?php foreach ($users as $user): ?>
        $('#choices-<?php echo $user->id; ?>').on('change', function (e) {
            e.preventDefault();
            const relatedOption = $('#choices-<?php echo $user->id; ?> option:selected').val();
            if (relatedOption !== '') {
                $('.relation_fields-<?php echo $user->id; ?>').slideDown();
            } else {
                $('.relation_fields-<?php echo $user->id; ?>').slideUp();
            }
            if (relatedOption === 'one') {
                $('#one_search-<?php echo $user->id; ?>').css('display', 'block');
            } else {
                $('#one_search-<?php echo $user->id; ?>').css('display', 'none');
            }
            if (relatedOption === 'two') {
                $('#two_search-<?php echo $user->id; ?>').css('display', 'block')
            } else {
                $('#two_search-<?php echo $user->id; ?>').css('display', 'none')
            }
            if (relatedOption === 'three') {
                $('#three_search-<?php echo $user->id; ?>').css('display', 'block');
            } else {
                $('#three_search-<?php echo $user->id; ?>').css('display', 'none');
            }
        });
        $('#one_search_list-<?php echo $user->id; ?>').select2();
        $('#two_search_list-<?php echo $user->id; ?>').select2();
        $('#three_search_list-<?php echo $user->id; ?>').select2();
        <?php endforeach; ?>
    });
</script>

结论

通过遵循上述步骤,你可以轻松地单独触发 PHP 循环中的每个模态框的 jQuery 函数。使用唯一标识符、针对每个模态框编写 jQuery、选择正确的元素以及初始化 Select2 库,可以确保模态框根据下拉菜单的值正确显示字段,并增强用户体验。

常见问题解答

Q1:为什么使用唯一标识符很重要?
A1:唯一标识符可确保为每个模态框和相关元素选择正确的 jQuery 元素,从而防止意外的行为。

**Q2:我可以在每个模