【web前端】可筛选[输入搜索]的select(重写)

可输入的html下拉列表框,自带筛选 此框下拉列表框可输入,可根据输入内容自动过滤模糊查询到的option值,点击弹框下拉列表框,选择完毕后下拉列表框自动隐藏,非常好用 立即下载
【web前端】可筛选[输入搜索]的select(重写)
 ---  filterSelect.js

/**
 * 将Select转变为支持输入内容对Select的Option进行筛选的js
 * @author wanghq
 * @Date 2017年12月4日 18:38:29
 * var $select = $("select["+TriangleDefinition.HTML_DEF_ATTR_KEY_FILTER_SELECT+"]").filterSelect();
   $(selectDOMRouteProcess).filterSelectReloadOption();// 把selectDOMRouteProcess变为可filterSelect
 */

$(document).ready(function(){ 
// 这段代码,是遍历所有拥有 TriangleDefinition.HTML_DEF_ATTR_KEY_FILTER_SELECT 属性的元素,并把他们变为可编辑 
if($("select["+TriangleDefinition.HTML_DEF_ATTR_KEY_FILTER_SELECT+"]").length > 0){
$("select["+TriangleDefinition.HTML_DEF_ATTR_KEY_FILTER_SELECT+"]").filterSelect();
}
}); 

/**
 * 将Select转化为FilterSelect
 */
$.fn.filterSelect = (function(){
    return function(){
        var $body = $("body");
        this.each(function(i, v){
         if($(v).parent().is("div") && $(v).parent().attr("class") == "m-input-select"){
         return false;// 如果当前Select已经是FilterSelect,则退出.
         }
            var $sel = $(v);// 得到Select的DOM
            var $div = $('<div class="m-input-select" style="width:'+$sel.width()+'"></div>');//生成覆盖层的DIV,宽度等于原Select宽度
            var $input = $("<input type='text' class='m-input' />");
            // var $wrapper = $("<div class='m-list-wrapper'><ul class='m-list'></ul></div>");
            var $wrapper = $("<ul class='m-list'></ul>");
            $div = $sel.wrap($div).hide().addClass("m-select").parent();
            $div.append($input).append("<span class='m-input-ico'></span>").append($wrapper);

            // 遮罩层显示 + 隐藏
            var wrapper = {
                show: function(){
                    $wrapper.show();
                    this.$list = $wrapper.find(".m-list-item:visible");
                    this.setIndex(this.$list.filter(".m-list-item-active"));
                    this.setActive(this.index);
                },
                hide: function(){
                    $wrapper.hide();
                },
                next: function(){
                    return this.setActive(this.index + 1);
                },
                prev: function(){
                    return this.setActive(this.index - 1);
                },
                $list: $wrapper.find(".m-list-item"),
                index: 0,
                $cur: [],
                setActive: function(i){
                    // 找到第1个 li,并且赋值为 active
                    var $list = this.$list, size = $list.size();
                    if(size <= 0){
                        this.$cur = [];
                        return;
                    }
                    $list.filter(".m-list-item-active").removeClass("m-list-item-active");
                    if(i < 0){
                        i = 0;
                    }else if(i >= size){
                        i = size - 1;
                    }
                    this.index = i;
                    this.$cur = $list.eq(i).addClass("m-list-item-active");
                    this.fixScroll(this.$cur);
                    return this.$cur;
                },
                fixScroll: function($elem){
                    // console.log($wrapper);
                    var height = $wrapper.height(), top = $elem.position().top, eHeight = $elem.outerHeight();
                    var scroll = $wrapper.scrollTop();
                    // 因为 li 的 实际 top,应该要加上 滚上 的距离
                    top += scroll;
                    if(scroll > top){
                        $wrapper.scrollTop(top);
                    }else if(top + eHeight > scroll + height){
                        // $wrapper.scrollTop(top + height - eHeight);
                        $wrapper.scrollTop(top + eHeight - height);
                    }
                },
                setIndex: function($li){
                    if($li.size() > 0){
                        this.index = this.$list.index($li);
                        $li.addClass("m-list-item-active").siblings().removeClass("m-list-item-active");
                    }else{
                        this.index = 0;
                    }
                }
            };

            // input 的操作
            var operation = {
                // 文字更变了,更新 li, 最低效率的一种
                textChange: function(){
                    val = $.trim($input.val());
                    $wrapper.find(".m-list-item").each(function(i, v){
                        if(v.innerHTML.indexOf(val) >= 0){
                            $(v).show();
                        }else{
                            $(v).hide();
                        }
                    });
                    wrapper.show();
                },
                // 设值
                setValue: function($li){
                    if($li && $li.size() > 0){
                        var val = $.trim($li.html());
                        $input.val(val).attr("placeholder", val);
                        $input.attr("title", val);
                        wrapper.setIndex($li);
                        $sel.val($li.attr("data-value")).trigger("change");
                    }else{
                        $input.val(function(i, v){
                            return $input.attr("placeholder");
                        });
                    };
                    wrapper.hide();
                    this.offBody();
                },
                onBody: function(){
                    var self = this;
                    setTimeout(function(){
                        self.offBody();
                        $body.on("click", self.bodyClick);
                    }, 10);
                },
                offBody: function(){
                    $body.off("click", this.bodyClick);
                },
                bodyClick: function(e){
                    var target = e.target;
                    if(target != $input[0] && target != $wrapper[0]){
                        wrapper.hide();
                        operation.setValue();
                        operation.offBody();
                    }
                }
            };

            // 遍历 $sel 对象
            function resetOption(){
                var html = "", val = "", defVal = "";
                $sel.find("option").each(function(i, v){
                if(i == 0){
             defVal = v.text;
             }
                    if(v.selected){
                        val = v.text;
                    };
                    html += '<li class="m-list-item'+ (v.selected ? " m-list-item-active" : "") +'" data-value="'+ v.value +'" title="'+ v.text +'">'+ v.text +'</li>';
                });
                if(val.length == 0 ){
                 val = defVal;
                }
                $input.val(val);
                $input.attr("title", val);
                $input.attr("placeholder", val);
                $wrapper.html(html);
            };
            $sel.on("optionChange", resetOption).trigger("optionChange");
            $sel.on("setEditSelectValue", function(e, val){
                // console.log(val);
                var $all = $wrapper.find(".m-list-item"), $item;
                for(var i = 0, max = $all.size(); i < max; i++){
                    $item = $all.eq(i);
                    if($item.attr("data-value") == val){
                        operation.setValue($item);
                        return;
                    }
                }
            });

            // input 聚焦
            $input.on("focus", function(){
                this.value = "";
                operation.textChange();
                operation.onBody();
            }).on("input propertychange", function(e){
                operation.textChange();
            }).on("keydown", function(e){
                // 上 38, 下 40, enter 13
                switch(e.keyCode){
                    case 38:
                        wrapper.prev();
                        break;
                    case 40:
                        wrapper.next();
                        break;
                    case 13:
                        operation.setValue(wrapper.$cur);
                        break;
                }
            });

            $div.on("click", ".m-input-ico", function(){
                // 触发 focus 和 blur 事件
                // focus 是因为 input 有绑定
                // 而 blur,实际只是失去焦点而已,真正隐藏 wrapper 的是 $body 事件
                $wrapper.is(":visible") ? $input.blur() : ($input.val("").trigger("focus"));
            });

            // 选中
            $wrapper.on("click", ".m-list-item", function(){
                operation.setValue($(this));
                return false;
            });

            setTimeout(function(){
                // for ie
                wrapper.hide();
            }, 1)
        });
        return this;
    };
})();

/**
 * 更新当前FilterSelect的Option
 */
$.fn.filterSelectReloadOption = (function(){
    return function(){
        this.each(function(i, v){
         var $div = $(v).parent();
         if($div.is("div") && $div.attr("class") == "m-input-select"){
          var $sel = $(v);// 得到Select的DOM
                 var $input = $div.find(":text[class='m-input']");
                 var $wrapper = $div.find("ul[class='m-list']");
                 $wrapper.empty();
               var html = "", val = "", defVal = "";
                 $sel.find("option").each(function(i, v){
                  if(i == 0){
                  defVal = v.text;
                  }
                     if(v.selected){
                         val = v.text;
                     };
                     html += '<li class="m-list-item'+ (v.selected ? " m-list-item-active" : "") +'" data-value="'+ v.value +'" title="'+ v.text +'">'+ v.text +'</li>';
                 });
                 if(val.length == 0 ){
                  val = defVal;
                 }
                 $input.val(val);
                 $input.attr("title", val);
                 $input.attr("placeholder", val);
                 $wrapper.html(html);
         }
        });
        return this;
    };
})();



--  filterSelect.css
 
.m-input-select {
display: inline-block;
*display: inline;
position: relative;
-webkit-user-select: none;
}

.m-input-select ul, .m-input-select li {
padding: 0;
margin: 0;
}

.m-input-select .m-input {
padding-right: 22px;
}

.m-input-select .m-input-ico {
position: absolute;
right: 0;
top: 0;
width: 22px;
height: 100%;
background:
url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAYAAABWdVznAAAATElEQVQoU2NkIBEwkqiegTwNcXFx/4m1CW4DMZoWLVrEiOIkfJpAikGuwPADNk0wxVg1gASRNSErxqkBpgldMV4NuEKNvHggNg5A6gBo4xYmyyXcLAAAAABJRU5ErkJggg==)
no-repeat 50% 50%;
}

.m-input-select .m-list-wrapper {
}

.m-input-select .m-list {
display: none;
position: absolute;
z-index: 1;
top: 100%;
left: 0;
right: 0;
max-width: 100%;
max-height: 250px;
overflow: auto;
border-bottom: 1px solid #ddd;
}

.m-input-select .m-list-item {
color: black;
cursor: default;
padding: 5px;
margin-top: -1px;
list-style: none;
background: #fff;
border: 1px solid #ddd;
border-bottom: none;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}

.m-input-select .m-list-item:hover {
background: #2D95FF;
}

.m-input-select .m-list-item-active {
background: #2D95FF;
}

PICO SCOPE 二次开发 基于C#开发一个简单的PICO示波器的上位机工作,与MCC600运动控制卡一起,实现数据自动采集 阅读详情

相关推荐

DMTF相关协议(一):Redfish和SMBIOS

Redfish 是一种管理标准,使用超媒体 RESTful 接口中的数据模型表示。该模型以标准的、机器可读的模式表示,消息的有效负载以 JSON 表示。该协议本身利用了 OData v4。由于它是一个超媒体 API,因此能够通过一致的接口表示各种实现。它具有管理数据中心资源、处理事件、长时间任务和发现的机制。

weixin_44032634的博客 2268

HTML下拉搜索,select筛选搜索

jQuery实现下拉搜索 点击输入框显示所有option option选项可滚动,已隐藏滚动条 输入框动态监听并筛选option <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>下拉搜索</title> <script src="http://libs.baidu.com/jquery/1.9.1/jquery.m

u014644574的博客 1万+

基于轻量级神经网络MobileNet V2的水果识别种类算法研究

本文阐述了一种基于轻量级卷积神经网络MobileNet V2的水果分类与识别算法研究。为了最大限度地促进机械收获,需要一个检测系统,它可以让我们识别不同类别的水果。一个相对未开发的想法是使用深度学习和人工智能算法,不仅可以检测水果的种类,还可以检测水果是否成熟。这可以证明是有利可图的,因为它可以提供作物生长状况以及成熟和未成熟果实的个体数量,以及决定是否是收获时间的有用信息。第一步对数据进行了预处理,数据预处理技术在众多的深度学习计算中起到了重要作用。

qq_43556680的博客 1641

html下拉选择框可筛选,jQuery+css3下拉选择框

豌豆 12019/7/19 9:43:10js稍微优化了一下,作者的JS不能多个一起使用$(function(){$(".select").each(function(){varf_this=$(this);var_p=f_this.children('p')$(this).children().click(function(e){f_this.toggleClass('open...

weixin_36269733的博客 241

sdio wifi 移植

介绍 简单来说,sdio起源自sd标准,顾名思义就是sd的IO接口(interface)的意思,更具体的说明,sd本来是记忆卡的标准,但是现在也可以把SD卡拿来插上一些外围设备接口使用,这个就是就叫做sdio。 而且sdio本身是一种相当单纯的技术,通过sd的IO引脚来连接外部外围,并且通过sd的IO数据接位与外围传输数据,而且sd协会也推出很完整的sdio stack 驱动程序,使得sdio外围得开发与应用变得非常热门 这里我们要移植的是RTL8822cs的sdio WiFi 模块,将其移植到rk3

Enosji的博客 9612

别再为H桥烧MOS管发愁了!手把手教你用IR2104搭建稳定电机驱动(附自举电路详解)

本文详细解析了使用IR2104半桥驱动芯片构建高可靠H桥电机驱动电路的全过程。从芯片内部架构、自举电路原理到PCB布局技巧和实战调试方法,帮助工程师彻底解决MOS管烧毁问题。重点讲解了自举电容选型、死区时间控制等关键设计要点,并附有示波器实测波形分析,是电机驱动设计的实用指南。

我的博客 740

Select增加搜索功能

select增加搜索功能

qq_33407279的博客 2433

使用RustDesk或者AnyDesk的TCP隧道实现Codesys系列PLC的远程调试和下载

Codesys远程调试

exat500g的博客 7280

【web前端】可筛选[输入搜索]的select

基于jquery, 带筛选,可搜索的 select 插件。与 select 元素无缝结合,最大程度上,保证 select 的原生性。兼容 ie7 及 以上浏览器

da宗熊专栏 1万+

Python 爬虫反爬突破:浏览器指纹深度伪装技术

在当前网络安全与反爬虫技术日趋成熟的环境下,传统的请求头伪装、IP 代理已无法满足复杂站点的爬虫需求。浏览器指纹作为网站识别爬虫、区分真实用户与自动化程序的核心技术,成为爬虫进阶必须突破的关键壁垒。浏览器指纹通过采集浏览器环境、硬件信息、渲染特性等多维数据生成唯一标识,即使更换 IP、清除 Cookie,网站仍可精准识别爬虫程序。本文聚焦浏览器指纹深度伪装技术,从指纹生成原理、核心指纹类型、Python 实现方案、高匿伪装实战到风控绕过策略,全方位讲解浏览器指纹的突破方法。Selenium 官方文档。

2503_91057718的博客 641

uniapp ios原生插件开发 (framework,cocoapods)

已知UniApp的插件开发方式有两种, 第一种 Xcode Framework的方式,这种方式是官方指定的方式。 这种方式的优点就是简单直接, 但也有不足,比如当插件需要引入一些三方库时,操作起来就不是那么方便。 而使用Cocoapods则可以很方便的引入三方库。 接下来,本文探索使用Cocoapods的方式来进行UniApp插件开发。

Rey的技术博客 9825

可输入筛选复选框select2组件的使用

select2详细介绍与相关文件的下载可以参考 http://select2.github.io/select2/ select2组件效果 效果图如下: 即支持多选,支持根据输入进行相似查询,支持值初始化,使用及其方便。 1 下载(http://select2.github.io/select2/)并引入相关的文件,包括jquery和select2的文件 <script t...

进化的深山猿 1914

13、Java 中 MQTT 异步通知与回调的使用及传感器命令处理

本文详细介绍了在 Java 中使用 MQTT 的异步通知与回调机制,并展示了如何通过 Paho Java 客户端处理与传感器交互的命令。文章包含代码示例,讲解了 MQTT 客户端的连接、订阅、消息处理以及模拟传感器数据发布的过程,适用于希望在 Java 应用中实现 MQTT 通信与设备控制的开发者。

eee77的博客 160

3步实现Layui Select组件拼音首字母搜索的终极指南

在日常Web开发中,面对城市选择、姓名筛选等中文选项较多的场景,你是否也曾为繁琐的滚动查找而烦恼?当用户需要从上百个城市选项中找到"北京"时,传统的中文输入搜索方式效率低下,体验不佳。本文将为你详细解析如何通过简单三步,为Layui Select组件添加拼音首字母搜索功能,彻底解决这一痛点。 ## 痛点分析:为什么需要拼音搜索? 想象一下这样的场景:一个电商平台的收货地址选择,包含全国300多

gitblog_00564的博客 842

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

【亲测免费】 Vue-Search-Select:智能与高效的前端筛选组件

Vue-Search-Select:智能与高效的前端筛选组件 是一个基于 Vue.js 的强大选择器组件,适用于需要进行模糊搜索和筛选功能的网页应用。它将简单的下拉列表与高效搜索引擎相结合,为用户提供了一种交互友好且响应迅速的选择体验。 技术分析 Vue-Search-Select 利用了 Vue.js 的数据绑定和组件化特性,使得该组件能够无缝融入你的 Vue 应用中。其核心功能包括: 实时模...

gitblog_00032的博客 1289

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

AI一键生成xm-select多选组件?快马平台让前端开发更高效

最近在做一个电商后台的商品筛选系统,需要实现一个多选下拉框功能,支持用户从大量分类中快速选择多个标签。经过一番调研,我发现了xm-select这个轻量级的多选下拉框组件,它完美契合我的需求。本文将分享如何快速实现一个功能完善的xm-select多选组件,以及我在使用。实际使用下来,从描述需求到看到运行效果,整个过程不超过5分钟。上描述你的需求,体验AI生成代码的便捷。整个过程无需配置环境,生成的代码可以直接运行和调整,对前端开发者来说确实是个效率利器。,我只需要简单描述需求,AI就能生成完整的实现代码。

SilvermistRaven28的博客 1054

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

3步实现React-Select高级过滤:从基础到业务级搜索逻辑

在现代Web应用中,下拉选择框(Select)是收集用户输入的核心组件之一。但面对复杂业务场景——如多条件筛选、模糊匹配、动态数据过滤时,原生HTML的``标签往往力不从心。React-Select作为React生态中最受欢迎的选择框组件,提供了强大的自定义过滤能力,让开发者能够轻松实现从简单搜索到复杂业务规则的各种需求。本文将通过实际代码示例,带你掌握如何定制React-Sele...

gitblog_00304的博客 712

BootstrapBlazor下拉搜索框:Select组件搜索功能完全指南

BootstrapBlazor Select组件是一款功能强大的下拉搜索框解决方案,它将传统下拉选择与实时搜索功能完美结合,帮助用户在大量选项中快速找到所需内容。无论是构建管理系统还是数据录入界面,这个组件都能显著提升用户体验和操作效率。 ## 为什么选择BootstrapBlazor Select组件? 在现代Web应用中,用户经常需要从大量选项中进行选择。传统的下拉框在面对数十甚至上百个选

gitblog_00703的博客 382

html5 input select,【Web前端问题】select如何实现既可以像input那样支持输入,又可以从下拉中选择? antd...

不可以多选,使用tags属性的时候会支持多选,希望能够保存自己输入的内容,网上找的答案说是用combobox跟tabIndex={0}这两个属性,试了下是不起作用的,我当前用的antd版本是3.15.0的,请问有遇到这问题的吗回答:为什么不用AutoComplete?回答:真的要使用select组件的话,也可以不用改造组件实现,配合showSearch以及onSearch:const {searc...

weixin_30193269的博客 681

Jellium Desktop媒体标签搜索教程:掌握高效内容筛选的终极技巧

Jellium Desktop作为一款非官方的Jellyfin桌面客户端,提供了强大的媒体管理与播放功能。本文将详细介绍如何利用其标签搜索功能快速定位和筛选媒体内容,帮助用户轻松管理个人媒体库。 ## 认识Jellium Desktop的媒体标签系统 Jellium Desktop通过标签系统对媒体内容进行分类管理,这些标签通常包括内容类型、格式、分辨率等关键信息。在客户端的Web界面中,标签

gitblog_00534的博客 1071

js,JQuery实现,带筛选,搜索的select

代码 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>网上找了个插件,但是不好用</title> <script src="jquery.js" charset="utf-8"></script&g...

weixin_30396699的博客 685

脱机数据的排序、搜索和筛选

 1. DataTable类的搜索和筛选功能l         根据主键值查找行DataRowCollection类的Find方法,接受包含要查找行的主键值为参数,因为是根据主键值查找,所以仅返回一个DataRow。DataTable tbl=new DataTable(“Customers”);da.Fill(tbl);tbl.PrimaryKey=new DataCol

肖大宝产品之路 775

Web3UIKit实战案例:构建一个完整的NFT市场前端应用

Web3UIKit是一套轻量级且可复用的Web3 UI组件库,专为去中心化应用(dapps)设计。本教程将带你通过实战案例,了解如何利用Web3UIKit快速构建一个功能完善的NFT市场前端应用,即使你是Web3开发新手也能轻松上手。 ## 📋 准备工作:环境搭建与依赖安装 在开始构建NFT市场之前,我们需要先准备开发环境并安装必要的依赖。 ### 1. 克隆项目仓库 首先,克隆Web3

gitblog_00628的博客 895

select2~给下拉选框增加搜索框插件

功能作用 给下拉框增加搜索框,支持本地或远程的动态搜索,非常好用哦 功能展示 原始的搜索框 使用了Select2之后 官网推荐 http://select2.github.io/select2/ 里面有超多超详细的案例哦 入门用例 官网已经有很详细的案例,建议看官网。 1、引入jq、select.css和select.js <link rel="stylesh...

xiaozhegaa的博客 1486

终极Bootstrap-select语义化搜索实战指南:让下拉框秒懂你的心思

在当今Web开发中,用户体验是决定项目成功的关键因素之一。Bootstrap-select作为一款功能强大的jQuery插件,将传统的HTML选择框(select元素)带入21世纪,提供了智能搜索、多选功能和现代化的界面设计。通过语义化搜索功能,它能让下拉框真正理解用户意图,实现快速精准的选择体验。 ## 🔍 什么是Bootstrap-select语义化搜索? Bootstrap-selec

gitblog_00123的博客 860

Bootstrap Blazor Select组件:打造高效搜索下拉框的终极指南

Bootstrap Blazor Select组件是一款基于Blazor的企业级UI组件库中的核心搜索选择器,它完美融合了传统下拉框与智能搜索功能,为用户提供流畅的数据选择体验。无论您是构建后台管理系统、数据录入界面还是复杂的筛选表单,这个组件都能显著提升用户操作效率。 ## 为什么需要智能搜索下拉框? 🤔 在传统Web应用中,用户面对包含数十甚至上百个选项的下拉框时,常常需要滚动查找,操作

gitblog_00236的博客 393
上一篇: MYSQL explain详解
下一篇: java.io.File中mkdir()和mkdirs()的区别
ole_triangle_java
博客等级 码龄10年 82粉丝 83原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值