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

news2025/2/21 14:53:17

模板使用(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 = {};

  // 删除item
  function 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]);
    }
  }

  // 添加item
  function 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());
});

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2301979.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【开源】思维导图:思绪思维导图 (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;用户需要通过文件管理器找到目…

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中…

【Java场景题】MySQL死锁排查

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

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

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

【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;这有助于精确检索信息。它…

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, 从…

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

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

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

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

PWM(脉宽调制)技术详解:从基础到应用实践示例

PWM&#xff08;脉宽调制&#xff09;技术详解&#xff1a;从基础到应用实践示例 目录 PWM&#xff08;脉宽调制&#xff09;技术详解&#xff1a;从基础到应用实践示例学前思考&#xff1a;一、PWM概述二、PWM的基本原理三、PWM的应用场景四、PWM的硬件配置与使用五、PWM的编程…

AI智能成长系统 | 应用探讨研究

研究背景 在现代家庭中&#xff0c;三岁宝宝的成长环境日益复杂。由于宝宝每天接触的人群多样&#xff0c;包括家庭成员、同龄小朋友以及可能的陌生人&#xff0c;其语言环境也相应地变得复杂多变。这种环境下&#xff0c;宝宝很容易接触到一些不适宜的语言&#xff0c;即俗称…

java 网络安全感知 网络安全学java

&#x1f345; 点击文末小卡片 &#xff0c;免费获取网络安全全套资料&#xff0c;资料在手&#xff0c;涨薪更快 实验五 java网络编程及安全 实验内容 1&#xff0e;掌握Socket程序的编写&#xff1b;2&#xff0e;掌握密码技术的使用&#xff1b;3&#xff0e;设计安全传输…

VisionMaster4.4 python脚本 图像处理 转换函数 爱之初体验

最近有接触过一丢丢VM4.3的模块开发. 一直有把python图像处理部分模块移植进来的打算 不过时间不够没来得及折腾.偶尔发现4.4支持py脚本 于是拿来折腾.一下午. 发现4.4支持python脚本,好开心. 首先安装VM4.4 注意一定要是4.4 打开后拖了一个模块. 但是发现import numpy imp…

python-leetcode 40.二叉树的层序遍历

题目&#xff1a; 给定二叉树的根节点root,返回其节点值得层序遍历&#xff08;即逐层从左到右访问所有节点&#xff09; 方法&#xff1a;广度优先搜索 # Definition for a binary tree node. # class TreeNode(object): # def __init__(self, val0, leftNone, rightNon…