select2远程数据及回显示例

情景

Bootstrap + PHP前后端分离的增删改查,有一个新增按钮,每一本书有一个修改按钮。

新增与修改使用同一个模态框(JavaScript动态显示按钮与模态框标题),可以填写每本书的信息。

有一栏为“分类”,希望用<select>实现单选功能,兼有搜索,能够从数据库查询分类表。

 工具

前端:jQuery 3.6.0、Bootstrap 3、select2 4.0.13

后端:PHP 7.3

前后端交互使用ajax与json

实现

HTML

在<head>中引入select2,i18n的语言包可以不引入,默认为英文,更多选择可以在这里查

<link href="https://cdnjs.cloudflare.com/ajax/libs/select2/4.0.13/css/select2.min.css" rel="stylesheet" />
<script src="https://cdnjs.cloudflare.com/ajax/libs/select2/4.0.13/js/select2.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/select2/4.0.13/js/i18n/zh-CN.js"></script>

模态框(id = "addBookModal")加入“分类”的div

<div class="form-group">
    <label class="col-sm-2 control-label">分类</label>
    <div class="col-sm-10">
        <select class="js-example-basic-single" name="state" id="new_book_category" style="width: 100%;"></select>
    </div>
</div>

JavaScript

写一个方法add_book_category_select2(),将上一步的select标签与select2绑定,并动态获取后端数据。add_book_category_select2()方法需要在$(document).ready()中调用。

$(document).ready(function(){
    add_book_category_select2();
});

function add_book_category_select2() {
    $('#new_book_category').select2({        // HTML下拉框绑定select2
        ajax: {
            url: "../PHP/getCategory.php",   // 后端地址
            dataType: 'json',
            type : 'GET',
            delay: 250,                      // 延迟250毫秒发送数据
            data: function (params) {
                return {
                    search: params.term      // params.term是搜索框输入的内容
                };
            },
            processResults: function (result) { //后端返回结果
                let allCategory = [];
                $.each(result, function(index, item){
                    const category = {id: item.id, text: item.name};    // 键必须是id和text,select2才能识别
                    allCategory.push(category);
                })
                return {
                    results: allCategory
                };
            },
            cache: true
        },
        minimumInputLength: 1,                // 最少输入一个字符才能触发请求
        dropdownParent: $('#addBookModal'),   // 在Bootstrap模态框中使用select2必须加这行,详情看官网”故障排除 - 常见问题“
        language: "zh-CN"                     // select2的界面语言选择中文,需要在HTML引入相关包
    });
}

PHP

<?php
header('Content-Type:text/json;charset=utf-8');    // 返回JSON必须加这行,否则一直undefined
require_once "db.php";                             // 连数据库
$search = $_GET['search'] ?? '';                   // 传过来的搜索值
if($search != "") {
    $sql = "SELECT CategoryID, CategoryName FROM category WHERE CategoryName LIKE '%$search%'";
    $result = mysqli_query($db, $sql);
    $arr = [];
    while($row = mysqli_fetch_array($result))
    {
        $arr[] = ["id"=>$row[0], "name"=>$row[1]];
    }
    echo json_encode($arr);
}

到这一步新增功能中使用select2获取分类已经全部实现,不过有个小bug。

每次点击新增按钮时,我使用下面这行代码清空上一次输入的数据:

$("#addBookModal form")[0].reset();

这样可以清除input输入的数据,不能清除select2,下一次打开面板时,上一次选中的分类依然在这里。我的解决方法是,加一行替换,把这个HTML<select>里的内容全部替换为空:

$("#new_book_category").html("");

这样每一次打开新增按钮,分类选择框都是空的。

修改时的回显

希望每次打开修改面板时,select2能回显数据库存入的数据。但select2没有提供这个功能,我们可以用jQuery做。

JavaScript

点击每个项的“修改”按钮时,请求一次后端并把数据回显到模态框里

$(document).on("click", ".edit-btn", function(){
    reset_form("#addBookModal form");    // 每次打开前都清理一遍数据
    const book_id = $(this).attr("edit-id");    // 取book_id,我在生成列表时把id存到edit-id属性里(不重要)
    $.ajax({
        url:"../PHP/getOneBook.php",    // 后端地址
        method:"GET",
        data:{
            id: book_id
        },
        success:function(result){
            // 其他的回显略过
            $("#select2-new_book_category-container").html(result.catName);    // 在选择框显示分类的名字,id格式为select2-你select的id-container,可以在控制台找找
            $("#new_book_category").html('<option value="' + result.catId + '">' + result.catName + '</option>');    // 拼一个<option>,这个option是隐藏的,打开下拉框看不到,只是jQuery取分类值时可以取到
        }
    });
    $("#addBookModal").modal({    // 打开新增/修改模态框
        backdrop: "static"
    });
});

希望可以帮到大家,有更好的方法也请告诉我 :)

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值