jQuery EasyUI 表单 – 过滤下拉数据网格

jQuery EasyUI 表单 – 过滤下拉数据网格(ComboGrid)

jQuery EasyUI 中的 combogrid(下拉数据网格)是将下拉框(combo)和数据网格(datagrid)结合的组件。下拉面板是一个可分页、可排序、可过滤的表格,非常适合处理大量数据(如商品列表、用户列表),用户可以在输入框中输入关键字实时过滤数据。

combogrid 支持两种过滤模式:

  • local:本地过滤(数据一次性加载,前端过滤)。
  • remote:远程过滤(推荐大数据场景,用户输入时发送请求到服务器过滤,返回匹配数据)。

1. 基本用法

<input id="cc" class="easyui-combogrid" style="width:300px;"
       data-options="panelWidth:500, idField:'productid', textField:'name'" />

JavaScript 初始化:

$('#cc').combogrid({
    url: 'products.php',  // 数据源
    idField: 'productid', // 值字段(提交时使用)
    textField: 'name',    // 显示在输入框的字段
    panelWidth: 500,
    panelHeight: 200,
    pagination: true,     // 启用分页
    pageSize: 10,
    fitColumns: true,
    columns: [[
        {field:'productid', title:'商品ID', width:80},
        {field:'name', title:'商品名称', width:120},
        {field:'price', title:'价格', width:80, align:'right'}
    ]]
});

2. 启用过滤(关键部分)

  • 默认模式为 remote(用户输入时自动过滤)。
  • remote 模式下,输入关键字时会向服务器发送参数 q=关键字(连同分页参数 page、rows)。

远程过滤示例:

$('#cc').combogrid({
    url: 'products.php',
    mode: 'remote',  // 显式设置为远程(默认就是remote)
    delay: 500,      // 输入延迟(毫秒),避免频繁请求
    idField: 'productid',
    textField: 'name',
    pagination: true,
    columns: [[ /* 同上 */ ]]
});

服务器端(PHP 示例)处理过滤:

$q = $_REQUEST['q'] ?? '';  // 获取过滤关键字
$sql = "SELECT * FROM products WHERE name LIKE '%$q%' LIMIT ?, ?";
 // 结合分页参数 page 和 rows 执行查询

本地过滤示例(小数据量):

$('#cc').combogrid({
    url: 'products.json',  // 一次性加载所有数据
    mode: 'local',
    filter: function(q, row) {  // 自定义过滤函数,返回 true 表示匹配
        return row.name.toLowerCase().indexOf(q.toLowerCase()) >= 0 ||
               row.productid.toString().indexOf(q) >= 0;
    },
    columns: [[ /* 同上 */ ]]
});

3. 多列过滤扩展(本地模式)

如果需要对多列进行模糊搜索,可以自定义 filter 函数:

filter: function(q, row) {
    q = q.toLowerCase();
    return (row.name && row.name.toLowerCase().indexOf(q) >= 0) ||
           (row.productid && row.productid.toString().indexOf(q) >= 0) ||
           (row.price && row.price.toString().indexOf(q) >= 0);
}

4. 在表单中使用

<form id="ff" method="post">
    <div>
        <label>商品:</label>
        <input name="product" class="easyui-combogrid"
               data-options="url:'products.php',mode:'remote',idField:'productid',
                             textField:'name',required:true,panelWidth:500,
                             pagination:true" />
    </div>
    <div>
        <input type="submit" value="提交" />
    </div>
</form>

<script>
$('#ff').form({
    onSubmit: function() {
        return $(this).form('validate');
    }
});
</script>

获取/设置值:

var value = $('#cc').combogrid('getValue');  // 获取选中 ID
$('#cc').combogrid('setValue', '001');      // 设置值
$('#cc').combogrid('grid').datagrid('reload');  // 刷新网格数据

5. 常见属性扩展

  • delay:输入防抖延迟(默认 400ms)。
  • onBeforeLoad:加载前事件,可自定义参数。
  • onSelect:选中行事件。
  • 支持 datagrid 的所有功能:排序、冻结列、formatter 等。

参考资源

  • 官方教程:https://www.jeasyui.com/tutorial/form/form5.php
  • 文档:https://www.jeasyui.com/documentation/combogrid.php
  • Demo 示例:https://www.jeasyui.com/demo/main/index.php?plugin=ComboGrid&view=filter
  • 中文教程:https://www.runoob.com/jeasyui/jeasyui-form-form5.html

combogrid 是处理海量数据下拉选择的首选组件,尤其远程过滤 + 分页,能极大提升性能和用户体验。如果需要多选、自定义列格式或其他高级功能,可以进一步扩展。有具体场景(如服务器端代码或多列搜索)可以再问!

文章已创建 3318

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

相关文章

开始在上面输入您的搜索词,然后按回车进行搜索。按ESC取消。

返回顶部