当前位置: 首页 > article >正文

layui 远程搜索下拉选择组件(多选)

模板使用(lay-module/searchSelect),依赖于 jquery、layui.dist 中的 dropdown 模块实现(所以data 格式请参照 layui文档)

<link rel="stylesheet" href="layui-v2.5.6/dist/css/layui.css" />
<link rel="stylesheet" href="lay-module/searchSelect/index.css" /><form id="app-form" class="layui-form layuimini-form"><div class="layui-form-item"><label class="layui-form-label">测试</label><div class="layui-input-block search-select-component"><!-- data-init以title字段作为显示 --><input name="tags" data-init='[{"id":1,"title":"123"}]' placeholder="Search..." class="layui-input search-select-input" /></div></div><div class="layui-form-item"><button type="submit" class="layui-btn" lay-submit lay-filter="demo-submit">确认</button><button type="reset" class="layui-btn">重置</button></div>
</form><script src="jquery.min.js"></script>
<script src="layui-v2.5.6/dist/layui.js"></script>
<script src="lay-module/searchSelect/index.js"></script>
<script>
layui.use(['jquery','form'], function () {const $ = layui.jquery;const form = layui.form;// 搜索下拉选择组件处理方法(默认拾取元素 elem: '.search-select-input')layui.searchSelect.render({onSearch: function (search) {console.log('onSearch', search);$.ajax({url: '/api/gelist',type: 'GET',data: {key: search.name,val: search.value,},dataType: 'json',success: function (res) {if (res.code == 1) {// res.data 中的 "title字段" 作为显示名称search.update(res.data);} else {layer.msg(res.msg, { icon: 2 });}},error: function () {layer.msg('network error', { icon: 2 });},});},});// 表单提交处理form.on('submit(demo-submit)', function(data){// 使用 layui.searchSelect.getValue 获取所有 searchSelect 值,传入 name 可以只取对应的value// 对应的value也会设置到对应的 .search-select-input 的 data-val 中const dd = layui.searchSelect.getValue();console.log(data, dd)});
});
</script>

searchSelect 模块实现(lay-module/searchSelect 目录中添加以下 index.js、index.css 文件)

1、index.css

.search-select-component .tags.select-list {display: flex;flex-direction: row;flex-wrap: wrap;gap: 10px;margin-top: 10px;margin-bottom: 20px;border: none;
}.search-select-component .tags.select-list:empty {margin-top: 0;margin-bottom: 0;
}.search-select-component .select-list-item {position: relative;padding-right: 20px;padding-top: 2px;
}.search-select-component .select-list-item .name {font-size: 14px;
}.search-select-component .select-list-item .del {position: absolute;top: 0;right: 0;font-size: 30px;font-weight: normal;line-height: 20px;float: none;width: 18px;padding: 0;cursor: pointer;text-align: center;opacity: 1;color: #ea0000;border: 0 none;background: transparent none repeat scroll 0 0;text-shadow: none;
}.search-select-component .layui-layer-msg {top: 40% !important;
}

2、index.js 文件

/** @Author: mojon* @Date:   2025-02-19 11:40:42* @Last Modified by:   hi916* @Last Modified time: 2025-02-19 15:52:33* @Last Modified description: 搜索下拉选择组件(多选)*/
layui.define(['jquery', 'dropdown'], function (exports) {'use strict';const $ = layui.jquery;const dropdown = layui.dropdown;// 绑定值let values = {};// 删除itemfunction delItem(event) {const name = $(event.target).data('name');const value = $(event.target).data('value');console.log('删除item', name, value);if (values[name]) {values[name] = values[name].filter((item) => JSON.stringify(item) != JSON.stringify(value));$(event.target).parent().remove();$(event.target).data('val', values[name]);}}// 添加itemfunction addItem(el, value) {const name = $(el).attr('name');values[name].push(value);$(el).data('val', values[name]);console.log('添加item', name, values[name]);// item容器const div = document.createElement('div');div.classList.add('select-list-item');// title显示 (以title字段作为显示)const span = document.createElement('span');span.classList.add('name');span.textContent = value.title;// del按钮const btn = document.createElement('button');btn.classList.add('del');btn.textContent = 'x';btn.setAttribute('type', 'button');btn.setAttribute('data-name', name);btn.setAttribute('data-value', JSON.stringify(value));// 监听删除事件btn.addEventListener('click', delItem);div.appendChild(span);div.appendChild(btn);$(el).siblings('.tags.select-list').append(div);// $(el).siblings('.tags.select-list').append(`//     <div class="select-list-item">//       <span class="name">${data.title}</span>//       <button type="button" class="del">×</button>//     </div>// `);}// 监听选择function onSelect(el) {// 插入选择存放位置$(el).after('<div class="tags select-list"></div>');// 获取配置const name = $(el).attr('name');const width = $(el).width();const dropdown = layui.dropdown;const dropdownHeight = 300;dropdown.render({elem: el,id: name,position: 'absolute', // 设置位置为相对data: [],style: `max-height: ${dropdownHeight}px;width: ${width}px;overflow-y: auto;overflow-x: hidden;`,click: function (obj) {if (values[name]) {const isInclude = values[name].find((item) => JSON.stringify(item) == JSON.stringify(obj));// 没有重复选择if (!isInclude) addItem(el, obj);}},});}// 更新下拉选择列表function updateDropdown(name, data) {dropdown.reload(name, { data, show: true });}// 监听执行搜索function onSearch(el, callback = () => {}) {let timer = null;$(el).on('input', function (e) {const val = $(this).val();const data = $(this).data();const name = $(el).attr('name');clearTimeout(timer);timer = setTimeout(() => {if (val) {console.log('搜索onSearch', val);callback({...data,name: name,value: val,update: (data) => updateDropdown(name, data),});}}, 500);});}// 初始化(处理初始状态显示)function init(el) {const name = $(el).attr('name');const initValues = $(el).data('init');if (initValues) {initValues.forEach((value) => addItem(el, value));}console.log('初始化init', name, values);}// 获取值function getValue(name) {if (name) {return values[name];} else {return values;}}// 加载配置function render(options) {// 配置const opt = {elem: '.search-select-input',onSearch: () => {},...options,};// 遍历所有 searchSelect$(opt.elem).each((index, el) => {const name = $(el).attr('name');if (name) {// 生成预处理值values[name] = [];// 监听选择onSelect(el);// 监听搜索onSearch(el, opt.onSearch);// 初始化处理init(el);}});}// 组件初始化function Component() {return {render: render,getValue: getValue,};}exports('searchSelect', new Component());
});

相关文章:

layui 远程搜索下拉选择组件(多选)

模板使用&#xff08;lay-module/searchSelect&#xff09;&#xff0c;依赖于 jquery、layui.dist 中的 dropdown 模块实现&#xff08;所以data 格式请参照 layui文档&#xff09; <link rel"stylesheet" href"layui-v2.5.6/dist/css/layui.css" /&g…...

【开源】思维导图:思绪思维导图 (Simple Mind Map)

目录 1. 思绪思维导图 2. 本地使用 3. 在线网页 1. 思绪思维导图 思绪思维导图&#xff0c;英文名称为Simple mind map&#xff0c;简称为SSM。 开源、免费 GitHub网址 支持多平台&#xff1a;Windows&#xff0c;Mac和Linux 支持在线和离线使用 2. 本地使用 安装包下载地址…...

国产编辑器EverEdit -告别东找西找!一键打开当前文件所在目录!

1 文件操作 2 应用场景 在文件编辑过程中&#xff0c;有时需要对文件进行一些操作&#xff0c;比如&#xff1a;在命令窗口输入文件路径、文件名&#xff0c;进入到文件目录&#xff0c;对文件进行压缩等&#xff0c;如果没有直达命令&#xff0c;用户需要通过文件管理器找到目…...

STM32MP157A单片机移植Linux驱动

在stm32mp157a单片机移植Linux操作系统&#xff0c;并移植内核驱动&#xff0c;在应用程序中使用3个线程&#xff0c;分别实现控制单片机上3个led流水灯的功能、蜂鸣器控制的功能、风扇控制的功能。 需求整理&#xff1a; 1.驱动程序-->led1.c&#xff0c;led2.c&#xff…...

UE引擎游戏加固方案解析

据VGinsights的报告&#xff0c;近年来UE引擎在过去几年中市场占比显著增长&#xff0c;其中亚洲市场增幅达到了30%&#xff0c;随着UE5的推出和技术的不断进步&#xff0c;UE引擎在独立开发者和移动游戏开发中的应用也在逐步增加。 UE引擎的优势在于强大的画面表现与视觉特效…...

[kubelet-check] It seems like the kubelet isn‘t running or healthy.

执行k8s时报错&#xff1a; [kubelet-check] It seems like the kubelet isn’t running or healthy. [kubelet-check] The HTTP call equal to ‘curl -sSL http://localhost:10248/healthz’ failed with error: Get "http://localhost:10248/heal ** 解决办法如下&a…...

C# 背景 透明 抗锯齿 (效果完美)

主要是通过 P/Invoke 技术调用 Windows API 函数 gdi32.dll/user32.dll&#xff0c;同时定义了一些结构体来配合这些 API 函数的使用&#xff0c;常用于处理图形绘制、窗口显示等操作。 运行查看效果 局部放大&#xff0c;抗锯齿效果很不错,尾巴毛毛清晰可见。 using System; u…...

关于uniApp的面试题及其答案解析

我的血液里流淌着战意&#xff01;力量与智慧指引着我&#xff01; 文章目录 1. 什么是uniApp&#xff1f;2. uniApp与原生小程序开发有什么区别&#xff1f;3. 如何使用uniApp实现条件编译&#xff1f;4. uniApp支持哪些平台&#xff0c;各有什么特点&#xff1f;5. 在uniApp中…...

Ubuntu编译ZLMediaKit

下载 git clone https://gitee.com/xia-chu/ZLMediaKit cd ZLMediaKit git submodule update --init安装工具 sudo apt install -y build-essential sudo apt install -y gcc g sudo apt install -y cmakesudo apt install -y build-essential cmake git libssl-dev libsdl1.…...

【Java场景题】MySQL死锁排查

大家好&#xff0c;今天XiXi给大家分享一个MySQL死锁排查的实验&#xff0c;文章主要有&#xff1a; 通过show engine innodb status&#xff0c;查看最近一次死锁信息开启innodb_print_all_deadlocks&#xff0c;在错误日志中能够记录所有死锁信息通过解析binlog日志定位死锁…...

Nginx解决前端跨域问题

1. 理解 CORS 和同源策略 1.1 同源策略 同源策略是一种浏览器安全机制&#xff0c;用于阻止不同源&#xff08;不同域名、协议或端口&#xff09;的 Web 应用相互访问数据。它确保了 Web 应用的隔离性&#xff0c;防止恶意网站访问用户数据或执行不安全的操作。 同源策略下&…...

Bootstrap Blazor UI 中 <Table> 组件 <TableColumn> 使用备忘01:EF Core 外码处理

应用场景&#xff1a;将外码转换为对应的文本进行显示、编辑。 例如&#xff0c;有一个【用户】表&#xff0c;其中有一个【用户类型ID】字段&#xff1b;另有一个【用户类型】表&#xff0c;包含【ID】、【名称】等字段。现在要求在 <Table> 组件显示列表中&#xff0c…...

LabVIEW心音信号采集与分析系统

基于LabVIEW软件的心音信号采集与分析系统能够实现心音的采集、去噪和分析。系统利用LabVIEW的强大功能和灵活性&#xff0c;通过模块化设计&#xff0c;实现了心音信号的高效处理和分析&#xff0c;具备深度学习和身份识别的实验能力&#xff0c;适用于医学和生物工程领域的研…...

python:多重继承、MRO(方法解析顺序)

在 Python 中&#xff0c;当类存在多重继承时&#xff0c;方法的调用顺序由 方法解析顺序&#xff08;Method Resolution Order, MRO&#xff09; 决定。 Python 使用 C3线性化算法 来确定类的继承顺序&#xff08;MRO&#xff09;&#xff0c;其核心规则是&#xff1a; 子类优…...

vue 父组件和子组件中v-model和props的使用和区别

一、v-model 1、v-model 可以在组件上使用以实现双向绑定。即父组件的值可以传递给子组件&#xff0c;子组件的值修改后&#xff0c;父组件的值会同步更新。 从 Vue 3.4 开始&#xff0c;推荐的实现方式是使用 defineModel() 宏&#xff1b; 2、示例&#xff1a;最常用的使用…...

【Scrapy】Scrapy教程7——存储数据

上一节我们对爬虫程序的默认回调函数parse做了改写,提取的数据可以在Scrapy的日志中打印出来了,光打印肯定是不行的,还需要把数据存储,数据可以存到文件,也可以存到数据库,我们一一来看。 存储数据到文件 首先我们看看如何将数据存储到文件,在讲[[【Scrapy】Scrapy教程…...

基础入门-算法解密散列对称非对称字典碰撞前后端逆向MD5AESDESRSA

知识点&#xff1a; 0、算法类型-单向散列&对称性&非对称性 1、算法识别加解密-MD5&AES&DES&RSA 2、解密条件寻找-逻辑特征&源码中&JS分析 应用场景&#xff1a; 1、发送数据的时候自动将数据加密发送&#xff08;只需加密即可&#xff09; 安全…...

在UBUNTU下搭建Deepseek

在UBUNTU下搭建Deepseek 一、安装UBUNTU 这个就不多说了&#xff0c;无外乎下载UBUNTU的iso&#xff0c;然后用UltraIso制作U盘&#xff0c;然后重启设置启动盘&#xff0c;安装… 二、安装Ollama curl -sSfL https://ollama.com/install.sh | sh这里可能需要你先安装curl工…...

O1 Embedder:让检索器思考后再行动

25年2月来自中科大和北京智源研究院的论文“O1 Embedder: Let Retrievers Think Before Action”。 大语言模型 (LLM) 的功能日益强大&#xff0c;彻底改变人们获取和利用信息的方式。值得注意的是&#xff0c;LLM 擅长执行细粒度数据表示&#xff0c;这有助于精确检索信息。它…...

【UCB CS 61B SP24】Lecture 4 - Lists 2: SLLists学习笔记

本文内容为重写上一节课中的单链表&#xff0c;将其重构成更易于用户使用的链表&#xff0c;实现多种操作链表的方法。 1. 重构单链表SLList 在上一节课中编写的 IntList 类是裸露递归的形式&#xff0c;在 Java 中一般不会这么定义&#xff0c;因为这样用户可能需要非常了解…...

Ubuntu系统3分钟本地部署DeepSeek-R1蒸馏模型,支持联网

本文提供Ubuntu ollama Page Assist&#xff0c;3步快速安装DeepSeek-R1蒸馏模型&#xff0c;支持联网&#xff0c;支持API。 目录 DeepSeek-R1安装分3步&#xff1a; Step 1, 安装ollama&#xff08;已安装可忽略&#xff09; Step 2, 下载DeepSeek-R1模型 Step 3, 从…...

Linux按照日期定时删除elasticsearch索引

使用sh脚本删除 searchIndexfilebeat elastic_url192.168.98.136 elastic_port9200 saveday7date2stamp () {date --utc --date "$1" %s }dateDiff (){case $1 in-s) sec1; shift;;-m) sec60; shift;;-h) sec3600; shift;;-d) sec86400; shift;;…...

谷粒商城—分布式高级②.md

认证服务 1. 环境搭建 创建gulimall-auth-server模块,导依赖,引入login.html和reg.html,并把静态资源放到nginx的static目录下 2. 注册功能 (1) 验证码倒计时 //点击发送验证码按钮触发下面函数 $("#sendCode").click(function () {//如果有disabled,说明最近…...

向量的点乘的几何意义

源自AI 向量的点乘&#xff08;Dot Product&#xff09;在几何和图形学中有重要的意义。它不仅是数学运算&#xff0c;还可以用来描述向量之间的关系。以下是点乘的几何意义及其应用&#xff1a; 1. 点乘的定义 对于两个向量 a 和 b&#xff0c;它们的点乘定义为&#xff1a;…...

Python Cookbook-2.2 写入文件

任务 写入文本或者二进制数据到文件中。 解决方案 下面是最方便的将一个长字符串写人文件的办法: open(thefile.txt,w).write(all_the_text)#写入文本到文本文件 open(abinfiler,wb).write(all_the_data)#写入数据到二进制文件不过&#xff0c;最好还是给文件对象指定个名字…...

机器学习,我们主要学习什么?

机器学习的发展历程 机器学习的发展历程&#xff0c;大致分为以下几个阶段&#xff1a; 1. 起源与早期探索&#xff08;20世纪40年代-60年代&#xff09; 1949年&#xff1a;Hebb提出了基于神经心理学的学习机制&#xff0c;开启了机器学习的先河1950年代&#xff1a;机器学习的…...

Unreal5从入门到精通之在编辑器中更新 UserWidgets

前言 在虚幻中创建越来越复杂和灵活的 UserWidget 蓝图时,一个问题是它们在编辑器中的外观与它们在游戏中的最终外观可能有很大不同。 库存面板示例 假设你想创建一个通用的库存显示小部件。我们可以在整个 UI 中使用它,无论我们需要在哪里显示某些内容。 标题,描述所显示…...

C语言-----操作符的分类

1. 操作符的分类 •算术操作符&#xff1a; 、- 、 * 、/、% 移位操作符:<< >> 位操作符: & | ^ 赋值操作符: / 、 % 、 、- 、 *、/、 %、 <<、 >>、&、| 、 ^ 单⽬操作符&#xff1a;&#xff01;、 、- 、 & 、 * 、 、 …...

mac os设置jdk版本

打开环境变量配置文件 sudo vim ~/.bash_profile 设置不同的jdk版本路径 # 设置JAVA_HOME为jdk17路径 export JAVA_HOME$(/usr/libexec/java_home -v 17)# 设置JAVA_HOME为jdk8路径 export JAVA_HOME$(/usr/libexec/java_home -v 1.8) 设置环境变量 # 将jdk加入到环境变量…...

深入理解WebSocket接口:如何使用C++实现行情接口

在现代网络应用中&#xff0c;实时数据传输变得越来越重要。通过WebSocket&#xff0c;我们可以建立一个持久连接&#xff0c;让服务器和客户端之间进行双向通信。这种技术不仅可以提供更快的响应速度&#xff0c;还可以减少不必要的网络流量。本文将详细介绍如何使用C来实现We…...