js自定義的可分類可搜索的下拉框組件

来源:https://www.cnblogs.com/chenyingying0/archive/2020/03/28/12589871.html
-Advertisement-
Play Games

html5搜索框結合datalist可以實現帶搜索功能的下拉框 不過嘗試了下,使用optgroup分組發現沒效果 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>search</title> </head> ...


html5搜索框結合datalist可以實現帶搜索功能的下拉框

不過嘗試了下,使用optgroup分組發現沒效果

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>search</title>
</head>
<body>
    <input type="text" list="data" id="mylist">
    <datalist id="data">
        <optgroup label="基礎"> 
            <option value="html">html</option>
            <option value="css">css</option>
            <option value="js">js</option>
        </optgroup>
        <optgroup label="框架"> 
            <option value="vue">vue</option>
            <option value="react">react</option>
        </optgroup>
    </datalist>
</body>
</html>

 

 

自己寫一個可以搜索和已經歸類的下拉框

放出效果圖

 

目錄結構

 

 

index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>search</title>
    <style>
        *{
            margin:0;
            padding:0;
            box-sizing: border-box;
        }
        body{
            background:#eee;
            font-size:14px;
            font-family: "微軟雅黑"
        }
        @font-face {
          font-family: "iconfont";
          src: url('font/iconfont.eot?t=1585396588464'); /* IE9 */
          src: url('font/iconfont.eot?t=1585396588464#iefix') format('embedded-opentype'), /* IE6-IE8 */
          url('data:application/x-font-woff2;charset=utf-8;base64,d09GMgABAAAAAAKYAAsAAAAABkAAAAJMAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHEIGVgCCcApMZwE2AiQDCAsGAAQgBYRtBy8bjAXILjGFawcSqIK0GIFz91T6AwAgHv7b73/7zJ1vKlE0i0dIpN8wrSS8ZUpnkdXy2/81TZGEy6suyyoakEJ/kH/AuYwkCjn2s2zkJuQmXOvbvU6Jm2QlEFVylb5XprzPczm9CXQg8wOd42gu2osWTepFYS8OKMC9MIoTKaGMG8YueIH3CVTr15PZ29g7hLLMXhaIS8fSoFxIyDIrVwrlDXuzeK5MZXqafvAs+n58tRxlkrKC3XB4bd2E2QdOrnhSeiIgJAnocBkKzAKZOG0s7MsJxuVUF/KGwbFqgw9KpcAvjuoR7K+zq2tBL1SfSfP0Ry0neKxB7cO0Se8i2u/fc/X1J21nl8Xdm7a2Ox0XLy0t51aL0uL7sT9/ovl6t/vdf42boZ8VQ6kjg6Dl4adXWmv/K2syeJfLyJ3hEKjcTzD4H9rAnmwYbF/KmtY4nLSfp6laNUpwpNn/VGfbySuhUtuEUIW+DIVKo2RmZ1GmxirKVdpEtRmbh2u0YDmRqzDtFiA0ekNS7y0KjX7JzP6hTLsVyjVGDtXOo+XMGuPhVHeZNCET9Qt0jChUbkCqce0+WSe+xnlDxB8Tp04ax4NRubxJIfESG9JTayKiUHEU4AZ4jHw/wpgjlwwZ2CLxdDhUTS8aGFEAVbsY0QhiQroLyGGIhFQwWlQrn99HLCd8Gu7oqiuPEZZyJkdjA6MB5KY1HNT1KM+kTlkmhFCQwiIBtAFmEZ8vguLmWS5iEAP2hFxsauj0U0Otg+3twd8dg2q2K4UzpVB2x9F8DQAAAA==') format('woff2'),
          url('font/iconfont.woff?t=1585396588464') format('woff'),
          url('font/iconfont.ttf?t=1585396588464') format('truetype'), /* chrome, firefox, opera, Safari, Android, iOS 4.2+ */
          url('font/iconfont.svg?t=1585396588464#iconfont') format('svg'); /* iOS 4.1- */
        }

        .iconfont {
          font-family: "iconfont" !important;
          font-size: 16px;
          font-style: normal;
          -webkit-font-smoothing: antialiased;
          -moz-osx-font-smoothing: grayscale;
        }
        .icon-xiala:before {
          content: "\e65c";
          color:#fff;
        }
        .container{
            margin:50px auto;
            width:200px;
            
        }
        .input-box{
            position: relative;
            width:202px;
            height:25px;
        }
        .input{
            width:200px;
            border:1px solid rgb(75,151,252);    
            height:25px;    
            padding:3px 8px;    
        }
        .btn{
            position: absolute;
            right:0;
            top:0;
            width:25px;
            height:25px;
            height:100%;
            background-color: rgb(75,151,252);    
            text-align:center;
            cursor: pointer;
        }
        .list-box{
            width:200px;
            height:auto;
            overflow-y:scroll;
            background-color: #fff;
            padding:5px;
            max-height:200px;
            display: none;
        }
        .search{
            width:100%;
            margin-bottom:5px;
            padding:2px;

        }
        input::-webkit-input-placeholder{
            font-size:12px;
        }
        dl{
            width:100%;
            height:auto;
            line-height:25px;
            margin-top:5px;
        }
        dd{
            padding-left:10px;
            cursor: pointer;
        }
        dt{
            font-weight:bold;
        }
        .info{
            text-align:center;
        }
    </style>
</head>
<body>
    <div class="container">
        <div class="input-box">
            <input type="text" class="input">
            <div class="btn"><i class="iconfont icon-xiala"></i></div>
        </div>
        <div class="list-box">
            <input type="text" class="search" placeholder="搜索">
            <!-- <dl>
                <dt>基礎</dt>
                <dd>html</dd>
                <dd>css</dd>
                <dd>js</dd>
                <dd>jQuery</dd>
            </dl>
            <dl>
                <dt>框架</dt>
                <dd>vue</dd>
                <dd>react</dd>
                <dd>angular</dd>
            </dl> -->
        </div>
    </div>
    <div class="info">
        <p>之前的值是:<span class="prev"></span></p>
        <p>改變後的值是:<span class="now"></span></p>
    </div>

    <script src="data.js"></script>
    <script src="index.js"></script>
    <script>
        window.onload=function(){
            let mysearch=new $Search({
                data
            });
        }
    </script>
</body>
</html>

 

data.js  數據

//數據對象
const data={
    "基礎":["html","css","js","jQuery"],
    "框架":["vue","react","angular"]
}

 

index.js

(function(window,document){

    //構造函數
    function Search(data){
        this.data=data.data;
        this.prevInfo="空";
        this.nowInfo="空";
        this.showListFlag=false;
        
        this.toDom(this.data);//生成DOM
        this.bindSearch();//綁定搜索框事件
        this.clickDD();//點擊DD事件
    }

    //生成DOM
    Search.prototype.toDom=function(data){
        let templates=``;

        for(let d in data){    

            let ddTemplates="";
            for(let i=0;i<data[d].length;i++){
                ddTemplates+=`
                    <dd>${ data[d][i] }</dd>
                `;
            }

            templates+=`
                <dl>
                    <dt>${ d }</dt>
                    `+
                    ddTemplates
                    +`
                </dl>
            `;
        }

        document.querySelector(".list-box").innerHTML+=templates;
        document.querySelector(".prev").innerHTML=this.prevInfo;
        document.querySelector(".now").innerHTML=this.nowInfo;

        //點擊顯示下拉框
        document.querySelector(".input-box").addEventListener("click",()=>{
            if(this.showListFlag){
                this.hideList();
            }else{
                this.showList();
            }
            
        })
    }

    //隱藏下拉框
    Search.prototype.hideList=function(){
        document.querySelector(".list-box").style.display="none";
        document.querySelector(".search").value="";
        this.showListFlag=true;
    }

    //顯示下拉框
    Search.prototype.showList=function(){
        document.querySelector(".list-box").style.display="block";
        document.querySelector(".search").value="";
        let dds=document.querySelectorAll("dd");
        
        dds.forEach(function(dd,index){
            dd.style.display="block";
        })
        this.showListFlag=true;
    }

    //綁定搜索框事件
    Search.prototype.bindSearch=function(){
        let search=document.querySelector(".search");

        search.addEventListener("keyup",()=>{
            let str=search.value;    
            this.hideDD(str);//隱藏不包含搜索內容的dd
        })
    }

    //隱藏不包含搜索內容的dd
    Search.prototype.hideDD=function(str){
        let dds=document.querySelectorAll("dd");
        
        dds.forEach(function(dd,index){
            dd.style.display="block";

            //不包含搜索內容的dd
            if(dd.innerText.indexOf(str)===-1){
                //隱藏
                dd.style.display="none";
            }
            
        })
    }

    //點擊dd事件
    Search.prototype.clickDD=function(){
        //事件代理
        document.querySelector(".list-box").addEventListener("click",(e)=>{
            if(e.target.nodeName!=="DD") return;

            if(this.showListFlag){
                this.hideList();
            }else{
                this.showList();
            }
            this.showListFlag=!this.showListFlag;
            
            //更新info
            document.querySelector(".prev").innerHTML=document.querySelector(".input").value;            

            let val=e.target.innerText;
            document.querySelector(".input").value=e.target.innerText;

            //更新info
            document.querySelector(".now").innerHTML=document.querySelector(".input").value;
        })
        
    }

    window.$Search=Search;
})(window,document);

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 早期我們怎麼進行資料庫操作呢? 1、原理:一般來說,Java應用程式訪問資料庫的過程是: 載入資料庫驅動程式; 通過jdbc建立資料庫連接; 訪問資料庫,執行SQL語句; 斷開資料庫連接。 2、代碼 1 //查詢所有用戶 2 Public void FindAllUsers(){ 3 //1、裝載s ...
  • MySQL資料庫 前言: 前面我們瞭解了什麼是資料庫,什麼是MySQL資料庫以及如何運用,接下來我們接著深入學習MySQL。 (提前聲明,以下所提供的事例不標準,僅供參考) 資料庫的備份與還原: 備份: 在cmd中輸入 mysqldump -u root -p 資料庫名稱 > 備份路徑 還原:兩種方 ...
  • 一.前言 H2 是一個用 Java 開發的嵌入式資料庫,它本身只是一個類庫,即只有一個 jar 文件,可以直接嵌入到應用項目中。H2 主要有如下三個用途: 第一個用途,也是最常使用的用途就在於可以同應用程式打包在一起發佈,這樣可以非常方便地存儲少量結構化數據。 第二個用途是用於單元測試。啟動速度快, ...
  • SQL編程 1).if-elseif-else語句 語法: if 條件 then //條件1 elseif 條件 then //條件2 else //條件3 end if; 示例演示: create procedure pro_9(in grade int) -- 輸入等級 begin if gra ...
  • 當前不少系統的資料庫依舊是MySQL5.6,由於MySQL5.7及MySQL8.0在性能及安全方面有著很大的提升,因此需要升級資料庫。本文通過邏輯方式、物理方式原地升級來介紹MySQL5.6 升級至MySQL5.7的方法,並介紹其使用場景。 1. 邏輯方式升級 邏輯方式升級其實就是通過邏輯備份工具( ...
  • 在SQL Server中,有時候查詢數據時,需要限定查詢時間範圍。此時需要對時間進行運算, 如下所示: USE AdventureWorks2014;GOSELECT *FROM HumanResources.EmployeeWHERE ModifiedDate > GETDATE() - 20; ... ...
  • 使用 WebView 配合 pdf.js 在 Android 上顯示 PDF 文件 ...
  • 一、Cookie SameSite屬性介紹 就像大家已經知道的,一旦設置Cookie之後,在Cookie失效之前瀏覽器會一直將這個Cookie在後續所有的請求中都傳回到Server端。我們的系統會利用Cookie這個特性做很多事情,但通常我們會在Cookie中存放加密的用戶身份,在Server端根據 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...