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

如何在原生JS结合Mixitup.js中添加正则实现前缀匹配文本过滤?

实现Mixitup.js的前缀类名过滤

我明白你现在的需求啦——想要让Mixitup的过滤只匹配元素类名的开头,而不是任意位置的子串。当前输入“reen”会带出“green”,就是因为默认的包含式匹配逻辑,咱们用正则就能轻松修正这个问题。

核心思路

要实现精准的前缀匹配,我们需要:

  • 用正则的^锚定类名的起始位置
  • 同时处理元素有多个类名的情况(比如<div class="item green">),所以要匹配「字符串开头+输入值」或者「空格+输入值」的模式,确保是完整类名的前缀

具体代码修改

假设你原本的过滤逻辑是这样的:

const container = document.querySelector('.container');
const searchInput = document.querySelector('.search-input');

// 初始化Mixitup
const mixer = mixitup(container);

// 输入框监听事件
searchInput.addEventListener('input', function() {
  const query = this.value.toLowerCase();
  
  // 原来的包含式过滤
  mixer.filter(function() {
    return this.classList.value.toLowerCase().includes(query);
  });
});

现在把过滤逻辑改成正则前缀匹配:

const container = document.querySelector('.container');
const searchInput = document.querySelector('.search-input');

const mixer = mixitup(container);

// 辅助函数:转义正则特殊字符(避免输入.、*等字符导致正则出错)
function escapeRegExp(string) {
  return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
}

searchInput.addEventListener('input', function() {
  let query = this.value.trim().toLowerCase();
  
  // 输入为空时显示所有元素
  if (!query) {
    mixer.filter('all');
    return;
  }

  // 创建前缀匹配正则:匹配以query开头的完整类名
  const escapedQuery = escapeRegExp(query);
  const regex = new RegExp(`(^|\\s)${escapedQuery}`, 'i');

  // 应用过滤
  mixer.filter(function() {
    return regex.test(this.classList.value);
  });
});

代码细节解释

  1. escapeRegExp函数:处理用户输入中的正则特殊字符(比如.、*),避免这些字符被当作正则语法解析,导致匹配逻辑出错
  2. 正则表达式(^|\\s)${escapedQuery}:
    • (^|\\s):匹配字符串开头或者空格,确保我们匹配的是一个完整类名的起始位置(不会误匹配类名中间的子串)
    • ${escapedQuery}:转义后的用户输入值,保证正则语法安全
    • 'i'标志:忽略大小写,让过滤更友好(比如输入“Blue”也能匹配“blue”类)
  3. regex.test(this.classList.value):检查当前元素的类列表字符串是否符合前缀匹配规则

这样修改后,输入“blue”只会匹配类名以blue开头的元素,输入“reen”就不会再匹配“green”啦~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 12:12:51