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

Flexdatalist jQuery插件searchIn选项能否指定自定义搜索属性?

如何在Flexdatalist中自定义搜索范围(包含自定义data属性)

可以实现,但默认的searchIn选项无法直接识别自定义的data-*属性,需要通过以下两种方式之一来实现你的需求:


方法1:预处理数据源,将自定义属性纳入搜索字段

先把<option>的data-keyword属性值提取出来,构建包含该字段的数据源,之后就能直接在searchIn中指定这个自定义字段:

<datalist id="myDatalist">
    <option value="exemple1" data-keyword="test example">Example1</option>
    <option value="exemple2" data-keyword="real example">Example2</option>
</datalist>
<input type="text" class="flexdatalist" list="myDatalist">
// 预处理datalist选项,构建完整数据源
const customData = [];
$('#myDatalist option').each(function() {
    customData.push({
        value: $(this).val(),
        label: $(this).text().trim(),
        keywords: $(this).data('keyword') || ''
    });
});

// 初始化Flexdatalist
$('.flexdatalist').flexdatalist({
    minLength: 1,
    selectionRequired: true,
    searchContain: true,
    searchByWord: true,
    data: customData, // 使用预处理后的数据源
    searchIn: ['label', 'keywords'], // 同时搜索label和自定义的keywords字段
    noResultsText: 'No result for {keyword}'
});

这种方式完全贴合插件的默认逻辑,后续维护起来更直观。


方法2:自定义searchFn搜索函数

如果不想修改数据源,可以通过searchFn选项手动实现搜索逻辑,直接检查每个选项的label和data-keyword属性:

<datalist id="myDatalist">
    <option value="exemple1" data-keyword="test example">Example1</option>
    <option value="exemple2" data-keyword="real example">Example2</option>
</datalist>
<input type="text" class="flexdatalist" list="myDatalist">
$('.flexdatalist').flexdatalist({
    minLength: 1,
    selectionRequired: true,
    searchContain: true,
    searchByWord: true,
    noResultsText: 'No result for {keyword}',
    // 自定义搜索逻辑
    searchFn: function(keyword, item, options) {
        // 找到当前item对应的原始option元素
        const option = this.$datalist.find(`option[value="${item.value}"]`);
        const keywordAttr = option.data('keyword') || '';
        const lowerKeyword = keyword.toLowerCase();
        
        // 检查label是否匹配
        const labelMatch = item.label.toLowerCase().includes(lowerKeyword);
        // 检查data-keyword中的任意关键词是否匹配(适配searchByWord: true)
        const keywordMatch = keywordAttr.split(' ').some(word => 
            word.toLowerCase().includes(lowerKeyword)
        );
        
        // 满足任一条件即视为匹配
        return labelMatch || keywordMatch;
    }
});

这个方法更灵活,适合需要动态调整搜索规则的场景。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 01:38:32