首页 > 其他分享 >带有多选和突出显示关键字的自定义下拉选择框(静态)

带有多选和突出显示关键字的自定义下拉选择框(静态)

时间:2024-12-02 16:14:28浏览次数:10  
标签:选项 function 多选 自定义 元素 关键字 事件 document option

带有多选和突出显示关键字的自定义下拉选择框:
Custom Dropdown Select Box with Multiple Selection and Highlighting Keywords:
不使用select元素,用div、ul、li、span元素实现带有多选和突出显示关键字的自定义下拉选择框。
完整控件包含三部分:

  1. 第一步用div模拟select选择框,ul+li模拟option选项,并用span标记关键词;
  2. 第二步CSS渲染展示效果;
  3. 第三步用原生JavaScript脚本实现点击选择,多选,取消选择,获取选中项结果(数组);

1,HTML模拟选择框

核心代码如下:

<!-- 自定义下拉选择框 html 开始 -->
<div class="custom-select">
    <div class="selected-options">
        <span class="placeholder">请选择...</span>
    </div>
    <ul class="options-list">
        <li class="option" data-value="option1">选项1 <span class="highlight">关键词</span></li>
        <li class="option" data-value="option2">选项2</li>
        <li class="option" data-value="option3">这个选项3 也有<span class="highlight">关键词</span></li>
        <li class="option" data-value="option4">选项4</li>
    </ul>
</div>
<!-- 自定义下拉选择框 html 结束 -->

搭配上CSS样式渲染就可以看到静态的选择框。接下来还学通过JavaScript脚本实现功能逻辑。

2,JavaScript脚本实现功能逻辑

我们知道JavaScript是浏览器前端脚本语言,要实现网页动态效果是很合适的。根据面向对象编程思想,首先我们得拿到要处理的对象,即HTML标签(DOM元素),例如:

var customSelect = document.querySelector('.custom-select');
var optionsList = document.querySelector('.options-list');
var selectedOptions = document.querySelector('.selected-options');
var options = document.querySelectorAll('.option');

接着我们对标签元素绑定事件驱动,例如:

监听DOMContentLoaded触发事件

DOMContentLoaded 是一个在网页的文档结构(DOM)加载完成后触发的事件,而不需要等待所有的外部资源(如图片、样式表、脚本等)加载完成。这个事件对于执行依赖于DOM解析完成后的JavaScript代码非常有用,因为它允许你尽早地开始执行代码,而不必等待整个页面完全加载。
    在JavaScript中,你可以使用 addEventListener 方法来监听 DOMContentLoaded 事件。以下是一个简单的示例:

// 网页的文档结构(DOM)加载完成后触发的事件
document.addEventListener('DOMContentLoaded', function (event) {
    event.stopPropagation(); // 阻止事件冒泡到外层元素
    console.log('DOM已加载完成!');  
    // 在这里执行你的代码 
}

    在这个示例中,当 DOMContentLoaded 事件触发时,会执行一个匿名函数,该函数在控制台输出一条消息。你可以在这个函数内部执行任何需要在DOM加载完成后运行的JavaScript代码。
    需要注意的是,DOMContentLoaded 事件只会在文档的初始加载时触发一次。如果你希望在页面加载完成后执行某些操作,并且这些操作需要在每次页面加载时都执行,你可能需要考虑使用其他方法,如 load 事件或 jQuery 的 $(document).ready() 方法(如果你在使用jQuery)。
    另外,如果你正在编写一个库或框架,并且需要确保在DOM加载完成之前不执行任何操作,那么监听 DOMContentLoaded 事件可能是一个很好的选择。这样可以确保你的代码在DOM结构可用时立即执行,而不必等待其他资源加载完成。

监听click触发事件

在JavaScript中,click事件是一个常用的鼠标事件,它在用户点击某个元素(例如,按钮、链接、图片等)时触发。你可以使用addEventListener方法来监听click事件,并在事件触发时执行相应的代码。
通过监听click事件,可以实现各种交互效果,例如按钮点击、链接跳转、图片放大等。可以通过addEventListener方法将click事件绑定到指定的元素上,并在事件触发时执行相应的操作。
以下是一个三种常见的简单示例代码,演示了如何使用click事件:

// 选项标签元素绑定click触发事件
document.querySelectorAll('.option').addEventListener('click', function (event) {
    event.stopPropagation(); // 阻止事件冒泡到外层元素
	console.log('选项标签元素被点击了!');
});

// 实时创建的标签元素绑定click触发事件
var span = document.createElement('span');
span.addEventListener('click', function (event) {
    event.stopPropagation(); // 阻止事件冒泡到外层元素
	console.log('实时创建的标签元素被点击了!');
});

// 点击选项以外的地方触发事件
document.addEventListener('click', function (e) {
    e.stopPropagation(); // 阻止事件冒泡到外层元素
    console.log('选项以外的地方被点击了!');
});

需要注意的是,同一个元素可以添加多个同类型的事件监听器,它们会按照添加的顺序依次执行。此外,你可以使用removeEventListener方法来移除之前添加的事件监听器。
这部分更详细可以参考:JavaScript操作addEventListener监听触发事件

数组的遍历、插入、删除操作

在JavaScript中,数组是一种常见的数据结构,可以包含多个元素,并且可以进行遍历、插入和删除等操作。

这部分更详细可以参考:JavaScript操作数组

调整标签元素展示样式

在JavaScript中,classList.toggle 是一个DOM(Document Object Model)元素的方法,用于切换元素的类名。如果元素已经包含指定的类名,则该类名会被移除;如果元素不包含指定的类名,则该类名会被添加。这个方法在动态修改元素的样式时非常有用。

这部分更详细可以参考:JavaScript操作DOM元素的classList

完整代码

完整代码(DropdownSelectBox.html 单个网页文件):

<!doctype html>
<html>
<head>
    <meta charset="UTF-8">
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <meta name="MobileOptimized" content="240">
    <meta name="applicable-device" content="mobile">
    <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0, user-scalable=no,shrink-to-fit=no">
    <meta name="format-detection" content="telephone=no,email=no,adress=no">

    <meta name="theme-color" content="#3c80d4" media="(prefers-color-scheme: light)">
    <meta name="theme-color" content="#9cc8ff" media="(prefers-color-scheme: dark)">

    <title>带有多选和突出显示关键字的自定义下拉选择框</title>
    <meta name="Description" content="带有多选和突出显示关键字的自定义下拉选择框:Custom Dropdown Select Box with Multiple Selection and Highlighting Keywords">
    <meta name="author" content="熊仔其人">

    <!-- CSS样式 -->
    <style type="text/css">
        /* 自定义下拉选择框 CSS 开始 */
        .custom-select {
            position: relative;
            width: 200px;
            border: 1px solid #ccc;
            border-radius: 5px;
            padding: 1px;
        }

        .selected-options {
            padding: 1px;
            cursor: pointer;
            background-color: #fff;
            display: flex;
            flex-wrap: wrap;
            gap: 5px;
        }

        .selected-options .selectedOptions-icon-cross {
            background-color: #f8f9fa;
            border: 1px solid #ccc;
            border-radius: 5px;
            padding: 1px;
        }

        .selected-options .selectedOptions-icon-cross::after {
            /* content: '\2717'; */
            content: '\2715';
        }

        .placeholder {
            color: #999;
        }

        .options-list {
            position: absolute;
            top: 100%;
            left: 0;
            right: 0;
            border: 1px solid #ccc;
            border-top: none;
            border-radius: 0 0 5px 5px;
            background-color: #fff;
            list-style: none;
            padding: 0;
            margin: 0;
            display: none;
            /* 默认隐藏选项列表 */
        }

        .option {
            padding: 5px;
            cursor: pointer;
        }

        .option:hover {
            background-color: #f2f2f2;
        }

        .option.selected {
            background-color: #e0e0e0;
        }

        .option.selected::after {
            /* content: '\221A'; */
            content: '\2713';
            color: #007bff;
            margin-left: 5px;
        }

        .highlight {
            color: red;
            /* 关键词标红 */
        }

        /* 显示选项列表 */
        .custom-select.active .options-list {
            display: block;
        }
        /* 自定义下拉选择框 CSS 结束 */
    </style>

</head>

<body>
    带有多选和突出显示关键字的自定义下拉选择框:
    Custom Dropdown Select Box with Multiple Selection and Highlighting Keywords:
    <hr />
    
    <!-- 自定义下拉选择框 html 开始 -->
    <div class="custom-select">
        <div class="selected-options">
            <span class="placeholder">请选择...</span>
        </div>
        <ul class="options-list">
            <li class="option" data-value="option1">选项1 <span class="highlight">关键词</span></li>
            <li class="option" data-value="option2">选项2</li>
            <li class="option" data-value="option3">这个选项3 也有<span class="highlight">关键词</span></li>
            <li class="option" data-value="option4">选项4</li>
        </ul>
    </div>
    <!-- 自定义下拉选择框 html 结束 -->

    <!-- 自定义下拉选择框 JS脚本 开始 -->
    <script>
        document.addEventListener('DOMContentLoaded', function (event) {
            event.stopPropagation(); // 阻止事件冒泡到外层元素
            var customSelect = document.querySelector('.custom-select');
            var optionsList = document.querySelector('.options-list');
            var selectedOptions = document.querySelector('.selected-options');
            var options = document.querySelectorAll('.option');

            // 显示/隐藏选项列表  
            selectedOptions.addEventListener('click', function (event) {
                event.stopPropagation(); // 阻止事件冒泡到外层元素
                customSelect.classList.toggle('active');
            });

            // 选项点击事件  
            options.forEach(function (option) {
                option.addEventListener('click', function (event) {
                    event.stopPropagation(); // 阻止事件冒泡到外层元素
                    var isSelected = this.classList.contains('selected');
                    this.classList.toggle('selected', !isSelected);

                    // 更新已选项显示  
                    updateSelectedDisplay();
                });
            });

            // 点击选项以外的地方关闭选项列表  
            document.addEventListener('click', function (e) {
                e.stopPropagation(); // 阻止事件冒泡到外层元素
                if (!customSelect.contains(e.target)) {
                    customSelect.classList.remove('active');
                }
            });

            // 更新已选项的显示  
            function updateSelectedDisplay() {
                var selectedItems = [];
                options.forEach(function (option) {
                    if (option.classList.contains('selected')) {
                        selectedItems.push({ value: option.getAttribute('data-value'), text: option.textContent.trim() });
                    }
                });

                // 清空并重新填充已选项  
                selectedOptions.innerHTML = '';
                if (selectedItems.length === 0) {
                    selectedOptions.appendChild(document.createTextNode('请选择...'));
                } else {
                    selectedItems.forEach(function (item) {
                        var span = document.createElement('span');
                        span.setAttribute('class', 'selectedOptions-icon-cross');
                        span.setAttribute('data-value', item.value);
                        span.textContent = item.text + ' ';
                        span.addEventListener('click', function (event) {
                            event.stopPropagation(); // 阻止事件冒泡到外层元素
                            var itemValue = this.getAttribute('data-value');
                            options.forEach(function (option) {
                                if (option.getAttribute('data-value') == itemValue) {
                                    option.classList.toggle('selected', false);
                                }
                            });

                            // 更新已选项显示  
                            updateSelectedDisplay();
                        });
                        selectedOptions.appendChild(span);
                    });
                }
            }
        });

        // 获取选中项
        function getSelectedItems() {
            var selectedItems = [];
            var selectedOptions = document.querySelectorAll('.custom-select .selected-options .selectedOptions-icon-cross');
            selectedOptions.forEach(function (option) {
                selectedItems.push({ value: option.getAttribute('data-value'), text: option.textContent.trim() });
            });

            return selectedItems;
        }

    </script>
    <!-- 自定义下拉选择框 JS脚本 结束 -->

</body>

</html>

效果

效果展示:

我这里是将可选择项写固定的,在实际项目中可以改成输入关键词,异步方法去后台查询可供选项的列表,绑定到前端该控件,然后就是正常的在项目中动态地使用了。

标签:选项,function,多选,自定义,元素,关键字,事件,document,option
From: https://www.cnblogs.com/xiongzaiqiren/p/18574429

相关文章

  • element 的 Notification 通知,自定义内容
    https://blog.csdn.net/m0_70547044/article/details/134642743?spm=1001.2101.3001.6650.1&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7ERate-1-134642743-blog-142925942.235%5Ev43%5Epc_blog_bottom_relevance_base4&......
  • 整型关键字的平方探测法散列 陈越
    #include<bits/stdc++.h>usingnamespacestd;map<int,int>bj;intp[30050];//埃筛法求voidgetprime(){ for(inti=1;i<=30050;i++)p[i]=1; p[0]=p[1]=0; for(inti=2;i<=30050;i++)if(p[i]==1)for(intj=2*i;j......
  • Element-Plus表格:Table自定义合并行数据的最佳实践
    “知行合一”——王阳明在开发项目中,我们时常会用到表格,许多需求可能会要求自定义特定的行或列。接下来,我们将探讨在实际开发中如何应对这一挑战。本文案例采用的技术:名称版本Vue3^3.5.12element-plus^2.8.8知识点我们先来复习下2个知识点,来自elem......
  • 通过自定义feignclient 的LoadBalancerFeignClient实现灵活的负载均衡策略
    通过自定义feignclient的LoadBalancerFeignClient或IRule能实现完全自定义的负载均衡策略,本文主要是通过实现自定义的LoadBalancerFeignClient而达到自定义的负载均衡策略示例代码实现如下:packagecn.zuowenjun.demo;importcom.netflix.loadbalancer.Server;importfeign......
  • 从 0 到 1 制作自定义镜像并用于训练(MPI+CPU/GPU)
    本章节介绍如何从0到1制作镜像,并使用该镜像在ModelArts平台上进行训练。镜像中使用的AI引擎是MPI,训练使用的资源是CPU或GPU。说明:本实践教程仅适用于新版训练作业。场景描述本示例使用Linuxx86_64架构的主机,操作系统ubuntu-18.04,通过编写Dockerfile文件制作自定义镜像。......
  • 从 0 到 1 制作自定义镜像并用于训练(Pytorch+CPU/GPU)
    本章节介绍如何从0到1制作镜像,并使用该镜像在ModelArts平台上进行训练。镜像中使用的AI引擎是PyTorch,训练使用的资源是CPU或GPU。说明:本实践教程仅适用于新版训练作业。场景描述本示例使用Linuxx86_64架构的主机,操作系统ubuntu-18.04,通过编写Dockerfile文件制作自定义镜像......
  • 通过代码实现log4net自定义配置
    大家在使用log4net的时候,常规的用法都是在配置文件里面进行设置。但是配置文件里面的配置项非常多,不利于记忆,所以说我们希望他能直接在代码中设置。于是,我写了个自定义日志配置的方法,核心的配置对象为RollingFileAppender,只需要对他进行设置就可以了。下面给大家展示下,基于......
  • .NET 项目自定义 MSBuild Task
    ......
  • vue3实现自定义导航菜单
    一、创建项目    1.打开HBuilderX图1    2.新建一个空项目        文件->新建->项目->uni-app        填写项目名称:vue3demo        选择项目存放目录:D:/HBuilderProjects        一定要注意vue的版本,当前选择的版......
  • easyexcel导出头部样式设置,多个tab导出,头部自定义RGB颜色
    alibabaeasyexcel版本3.0.5,poi版本4.1.2,导出头部样式设置,多个tab导出,头部自定义RGB颜色 效果,头部三行,三个tab  下面贴出代码:packagecom.alpha.erp.dto.accounts;importcom.alibaba.excel.metadata.Head;importcom.alibaba.excel.metadata.data.WriteCellDa......