创建基于Bootstrap的下拉菜单的DropDownList的JQuery插件

Bootstrap是当下流行的前端UI组件库之一。利用Bootstrap,可以很方便的构造美观、统一的页面。把设计师从具体的UI编码中解放出来。

 

Bootstrap提供了不少的前端UI组件。带下拉菜单的文本框就是其中之一,效果图如下(真要自己完全设计,还得费一番功夫)

image

 

关于该组件的详情参看Bootstrap官网、带下拉菜单的文本框

 

看到上面的效果图,使我想到WinForm编程中的DropDownList控件。不过,和DropDownList控件相比,还缺少以下内容

1、当点击菜单中的某一项,菜单的文字自动显示在文本框中

2、当点击菜单中的某一项,提供一个函数来获得相关的数据(可以是菜单的文字,也可以是相关的文本)

3、文本框不能编辑,只能通过点击菜单来更改内容

4、能设置下拉菜单的最大高度,使得菜单项过多时,能出现滚动条。(想想看,30条目将会占满整个屏幕是多么恐怖的事)

 

当然,Bootstrap只提供了前端UI的外观,上面的这几条都可以通过编码来完成

 

基于码农的精神,自力更生,自己写一个DropDownList的JQuery组件。

先规划好这个JQuery组件的属性:

InputName:文本框的name和id属性,默认值是“Q”;

ButtonText:右侧按钮的文字,默认值是“示例”;

ReadOnly:文本框的可编辑性属性。默认是true,也就是不能编辑,只能通过点击菜单来改变文字;

MaxHeight:下拉菜单的最高高度。默认值是-1,不设置最高高度,菜单的高度由菜单的条目决定;

onSelect:设置选择菜单条目时调用的函数。默认值是$.noop(),JQuery中的空函数;

Items:菜单条目的集合。每个菜单项提供ItemText属性(菜单文字)、ItemData属性(相关数据)、Selected属性(默认选择项,有多个,算最后一个)

Sections:菜单组的几何。每个组包含ItemHeader属性(组标题文字)、Items属性(该组菜单条目的集合)。每个组之间有一条分割线。该属性的优先级高于Items属性(如果仅仅设置了Items,则意味着只有一个菜单组,没有分割线,没有组标题文字)。

 

DropDownList的组件代码如下,由于是基于JQuery,故要把该代码置于JQuery引用代码之下:

代码比较简单,主要就是依据属性值来拼接HTML代码,下面简单的说明一下:

ReadOnly的实现:由于不是通过设置文本框的ReadOnly属性(会改变文本框的外观),因此采用绑定屏蔽掉文本框的cut、copy、paste、keydown事件来实现。

MaxHeight的实现:判断下拉菜单(元素UL)的高度是否超过MaxHeight,若超过则设置CSS属性Height和Overflow

onSelect函数:要自己实现一个函数,参数有两个值,第一个值是文本框的名字,第二个是当前点中的菜单项的相关数据(ItemData属性)

 

  • <script>
  • (function($){
  •     jQuery.fn.DropDownList = function(options) {
  •        
  •         //设置插件的默认属性
  •         var defaults ={
  •             InputName:"Q",
  •             ButtonText:"示例",
  •             ReadOnly:true,
  •             MaxHeight:-1,
  •             onSelect:$.noop(),
  •         }
  •  
  •         var options = $.extend(defaults,options);
  •  
  •         return this.each(function(){
  •             var o=options;
  •             var Obj=$(this);
  •   
  •             var S="<div class='input-group'>";
  •             S = S + "<input type='text' class='form-control' name='" + o.InputName + "' id='" + o.InputName + "'  />";
  •             S = S + "<div class='input-group-btn'>";
  •             S = S + "<button type='button' class='btn btn-default dropdown-toggle' data-toggle='dropdown'>" + o.ButtonText + "<span class='caret'></span></button>";
  •             S = S + "<ul class='dropdown-menu dropdown-menu-right' role='menu'>";
  •   
  •             //可以由Sections参数或Items参数设置下拉条目,Sections的优先级比Items高
  •             if (o.Sections!== undefined)
  •             {
  •                 $.each(o.Sections,function(n,value){
  •                        
  •                     //从第2节开始,在每节的顶部添加一条分割线
  •                     if (n>0) { S=S + "<li class='divider'></li>"; }
  •  
  •                     //如果设置了ItemHeader参数,则给该节添加标题文本
  •                     if (value.ItemHeader!==undefined) { S = S + "<li class='dropdown-header'>" + value.ItemHeader + "</li>"; }
  •  
  •                     CreateItem(value);
  •                 });
  •             }
  •             else
  •             {
  •                 CreateItem(o);
  •             }
  •   
  •  
  •             var SelText="";
  •             var SelData="";
  •  
  •             function CreateItem(Items)
  •             {
  •                 $.each(Items.Items,function(n,Item){
  •  
  •                     //如果ItemData参数没有定义,则把ItemText参数传给ItemDate
  •                     if (Item.ItemData===undefined) {Item.ItemData=Item.ItemText;}
  •  
  •                     S=S + "<li><a href='#'  ItemData='"  + Item.ItemData + "' >" + Item.ItemText + "</a></li>";
  •  
  •                     //如果设置了Selected参数,则获取该条目的ItemDada和ItemText。
  •                     //如果有多个条目设置该参数,则获取的是满足条件最后一个条目
  •                     if (Item.Selected==true) { SelText=Item.ItemText;SelData=Item.ItemData;}
  •                 });
  •             }
  •   
  •   
  •             S =S + "</ul></div></div>";
  •   
  •             Obj.html(S);
  •   
  •             var Input=Obj.find("input");
  •  
  •             //如果有条目设置Selected参数,则调用设置活动条目的函数
  •             if (SelText!="") { SetData(SelText,SelData); }
  •   
  •             //给所有的条目绑定单击事件,单击后调用设置活动条目的函数
  •             Obj.find("a").bind("click", function(e) {SetData($(this).html(),$(this).attr("ItemData"));});
  •   
  •             //如果ReadOnly参数设置为true,则屏蔽掉文本框的相关事件,使得文本框不能编辑。(而又显示为激活状态)
  •             if (o.ReadOnly==true)
  •             {
  •                 Input.bind("cut copy paste keydown", function(e) {e.preventDefault();});
  •             }
  •   
  •             //设置MaxHeight参数后(大于0),则设置下拉菜单的最大高度,若条目过多,会出现垂直滚动条
  •             if (o.MaxHeight>0)
  •             {
  •                 var UL=Obj.find("ul");
  •                 if (UL.height()>o.MaxHeight)
  •                 {UL.css({'height':o.MaxHeight,'overflow':'auto'});}
  •             }
  •   
  •             function SetData(Text,Data)
  •             {
  •                 Input.val(Text);
  •                 if (o.onSelect) { o.onSelect(o.InputName,Data); }
  •             }
  •                  
  •         });
  •     }
  • })(jQuery);
  •  
  • </script>

下面是几个用法实例:对Id为DropDownList的div元素运用组件,则在该div内部添加一个DropDownList组件

 

1、用Items属性实现下拉菜单(所有菜单项都在一个组里,没有组标题,没有分割线)

 

  • function ShowData(InputName,Data)
  • {
  •     alert(InputName + ":" + Data); 
  • }
  •  
  • $("#DropDownList").DropDownList(
  •     {
  •         InputName:"Q",
  •         ButtonName:"参考",
  •         onSelect : function(I,Data)
  •             {
  •                 ShowData(I,Data);
  •             },
  •  
  •         Items:[
  •             {ItemText:"示例1",ItemData:"Demo1",Selected:true},
  •             {ItemText:"示例2",ItemData:"Demo2"},
  •             {ItemText:"示例3",ItemData:"Demo3"}
  •         ]
  •     });

效果图:

image

 

 

2、用Sections属性实现下拉菜单(菜单组之间有分割线,菜单组可以设置组标题)

 

  • function ShowData(InputName,Data)
  • {
  •     alert(InputName + ":" + Data); 
  • }
  •  
  • $("#DropDownList").DropDownList(
  •     {
  •         InputName:"Q",
  •         ButtonText:"参考",
  •         onSelect : function(I,Data)
  •             {
  •                 ShowData(I,Data);
  •             },
  •  
  •         Sections:[
  •             {
  •                 ItemHeader:"全部",
  •                 Items:[
  •                     {ItemText:"全部",ItemData:"All"}
  •                 ]
  •             },
  •             {
  •                 Items:[
  •                     {ItemText:"示例1",ItemData:"Demo1",Selected:true},
  •                     {ItemText:"示例2"}
  •                 ]
  •             }
  •         ]
  •     });

效果图:

image

 

3、实现全国省份直辖市的下拉选择,要设置MaxHeight属性

 

  • function ShowData(InputName,Data)
  • {
  •     alert(InputName + ":" + Data); 
  • }
  •  
  • $("#DropDownList").DropDownList(
  •     {
  •         InputName:"Q",
  •         ButtonText:"参考",
  •         MaxHeight:310,
  •         onSelect : function(I,Data)
  •             {
  •                 ShowData(I,Data);
  •             },
  •  
  •         Sections:[
  •             {
  •                 ItemHeader:"直辖市",
  •                 Items:[
  •                     {ItemText:"北京",ItemData:"Beijing"},
  •                     {ItemText:"上海",ItemData:"Shanghai",Selected:true},
  •                     {ItemText:"天津",ItemData:"Tianjin"},
  •                     {ItemText:"重庆",ItemData:"Chongqing"}
  •                 ]
  •             },
  •             {
  •                 ItemHeader:"华东地区",
  •                 Items:[
  •                     {ItemText:"山东",ItemData:"Shandong"},
  •                     {ItemText:"江苏",ItemData:"Jiangsu"},
  •                     {ItemText:"安徽",ItemData:"Anhui"},
  •                     {ItemText:"浙江",ItemData:"Zhejiang"},
  •                     {ItemText:"福建",ItemData:"Fujian"}
  •                 ]
  •             },
  •             {
  •                 ItemHeader:"华南地区",
  •                 Items:[
  •                     {ItemText:"广东",ItemData:"Guangdong"},
  •                     {ItemText:"广西",ItemData:"Guangxi"},
  •                     {ItemText:"海南",ItemData:"Hainan"}
  •                 ]
  •             },
  •             {
  •                 ItemHeader:"华中地区",
  •                 Items:[
  •                     {ItemText:"湖北",ItemData:"Hubei"},
  •                     {ItemText:"湖南",ItemData:"Hunan"},
  •                     {ItemText:"河南",ItemData:"Henan"},
  •                     {ItemText:"江西",ItemData:"Jiangxi"}
  •                 ]
  •             },
  •             {
  •                 ItemHeader:"华北地区",
  •                 Items:[
  •                     {ItemText:"河北",ItemData:"Hebei"},
  •                     {ItemText:"山西",ItemData:"Shanxi"},
  •                     {ItemText:"内蒙古",ItemData:"Neimenggu"}
  •                 ]
  •             },
  •             {
  •                 ItemHeader:"西北地区",
  •                 Items:[
  •                     {ItemText:"宁夏",ItemData:"Ningxia"},
  •                     {ItemText:"新疆",ItemData:"Xinjiang"},
  •                     {ItemText:"青海",ItemData:"Qinghai"},
  •                     {ItemText:"陕西",ItemData:"Shaanxi"},
  •                     {ItemText:"甘肃",ItemData:"Gansu"},
  •                 ]
  •             },
  •             {
  •                 ItemHeader:"西南地区",
  •                 Items:[
  •                     {ItemText:"四川",ItemData:"Sichuan"},
  •                     {ItemText:"云南",ItemData:"Yunnan"},
  •                     {ItemText:"贵州",ItemData:"Guizhou"},
  •                     {ItemText:"西藏",ItemData:"Xizang"}
  •                 ]
  •             },
  •             {
  •                 ItemHeader:"东北地区",
  •                 Items:[
  •                     {ItemText:"辽宁",ItemData:"Liaoning"},
  •                     {ItemText:"吉林",ItemData:"Jilin"},
  •                     {ItemText:"黑龙江",ItemData:"Heilongjiang"}
  •                 ]
  •             }
  •         ]
  •     });

效果图:

image

 

唯一的遗憾就是有滚动条的时候,滚动条会覆盖下拉菜单右侧的两个圆角,如果真要完美的话,可能要对Bootstrap中的源代码进行修改了。

DropDownList下拉框多选 DropDownList下拉框多选demo 立即下载

相关推荐

深入解析luckyExcel处理xlsx与xls文件的实战技巧

本文深入解析了使用luckyExcel库在前端处理.xlsx与.xls文件的实战技巧。针对.xlsx文件,可直接调用API转换;对于老旧的.xls格式,则需结合SheetJS进行预处理。文章详细介绍了核心API的使用、两种格式的处理流程、数据提取方法以及性能优化建议,为开发在线Excel编辑应用提供了完整解决方案。

cherry的博客 818

Bootstrap5 下拉菜单

Bootstrap5 下拉菜单

听海边涛声 1749

CKEditor5富文本编辑器 - 视频引入、预览及自定义toolbar

文章目录定义遇到的问题视频部分引入媒体url失败原因解决方法:自定义视频provider视频预览及页面不显示视频问题解决方案:H5 \标签如何移除toolbar中的部分插件 一个小后端很少接触前端框架,只能在知识的海洋中漂泊。。。 定义 <script src="https://cdn.ckeditor.com/ckeditor5/16.0.0/classic/ckeditor.js"&gt...

huhui806的博客 8198

Bootstrap的下拉菜单组件相关知识

Bootstrap的下拉菜单组件

昊虹AI笔记 3564

3.1使用Python读取excel的二维数据

要使用 Python 读取 Excel 的二维数据,可以使用 openpyxl 或 pandas 库。

kenshin1980的专栏 1032

SAP FIORI静态磁贴从零到一:配置实战与权限打通

本文详细介绍了SAP FIORI静态磁贴的配置流程与权限管理,从准备工作到后台配置、目标映射、前台组织及权限分配,提供了实战技巧与常见问题解决方案。重点解析了静态磁贴的创建、目标映射配置及权限打通等关键步骤,帮助用户快速掌握FIORI静态磁贴的配置方法。

weixin_29266647的博客 249

5.4 Bootstrap 下拉菜单(Dropdown)插件

Bootstrap 下拉菜单 这一章讲解了下拉菜单,但是没有涉及到交互部分,本章将具体讲解下拉菜单的交互。使用下拉菜单(Dropdown)插件,您可以向任何组件(比如导航栏、标签页、胶囊式导航菜单、按钮等)添加下拉菜单。如果您想要单独引用该插件的功能,那么您需要引用 dropdown.js。或者,正如 Bootstrap 插件概览 一章中所提到,您可以引用 bootstrap.js 或压缩版的 bootstrap.min.js。下拉菜单切换有一个简单的方法用来显示或隐藏下拉菜单。

梁辰兴的博客 1115

WIFI CSI动作识别数据集全解析:从数据采集到深度学习应用

本文全面解析了利用商用Wi-Fi设备的信道状态信息进行动作识别的完整流程。文章以经典WiSA数据集为例,深入剖析了CSI数据的采集原理、结构特点,并详细阐述了从原始数据预处理、特征工程到深度学习模型(如CNN-LSTM融合架构)构建与优化的关键技术,旨在为研究者提供从数据到应用的全链路实战指南。

r2s3t4的博客 281

基于Bootstrap的DropDownList的JQuery组件的完善版

在前文 创建基于Bootstrap的下拉菜单的DropDownList的JQuery插件 中,实现了DropDownList的JQuery组件,但是留有遗憾。就是当下拉菜单出现滚动条的时候,滚动条会覆盖菜单右侧的两个圆角。使得下拉菜单左侧有2个圆角,右侧没有,看上去不是很完美。如下图所示:   本文的内容就是如何恢复右侧的圆角   先看看原本的下拉菜单的HTML结构:   ...

weixin_34015860的博客 146

玩转Docker小游戏项目系列:Docker部署吃豆人经典小游戏

玩转Docker小游戏项目系列:Docker部署吃豆人经典小游戏

jks212454的博客 733

【完整梳理验证】企业微信第三方应用接入全流程java版

由企业内部的开发者自己开发部署,相当于是企业自己的资产,调用接口基本没有任何限制。由SaaS服务商的开发者开发并部署在服务商侧,面向所有企业。需要企业授权使用(先试用后付费),服务商仅可获取企业授权部分的权限,相当于白名单控制。由服务商的开发者开发,但部署在企业内部。一般是线下签约采购方式,因此权限几乎与自建应用无异,企业管理员只需要配置不对服务商开放的敏感权限,相当于黑名单控制。服务商后台地址:企业微信服务商官网企业管理后台地址:企业微信管理后台服务商,可以理解为 SAAS 中的运营端。企业管理端,可以理

Hello, New World! 2761

DropDownList控件的使用(方法,属性)

在.net中,DropDownList和ListBox是最常用的两个LIST控件,我的学习笔记也从这里开始吧! 一、DropDownList 命名空间:System.Web.UI.WebControls 程序集:System.Web(在 system.web.dll 中) 一些常用的属性: DataMember 当数据源包含多个不同的数据项列表时,获取或设置数据绑定控件绑定到的数据列表的

shan1774965666的专栏 1万+

STM32 HAL PWM (占空比) -电机软启动不到位解决

为了避免电机启动电压大造成设备损坏,或者供电不足导致重启,通常在对启动都需要一个PWM进行软启动,下面对PWM电机软启动详细介绍。

weixin_44597885的博客 867

jquery+bootstrap自定义插件开发之dropdownlist

真的是不太会起名字了,这样吧,先把效果图上来大家看看吧。这个插件可以使用在 类似教师讲课或者章节之类吧这个效果用到了bootstrap这个轻量级的前端框架,真的是非常棒。引入bootstrap的资源文件后引入jqery是必须的。然后前端的DOM结构是这样的<divclass="btn-toolbarbtn-toolbar-top"id="dropdown-list">...

weixin_34029949的博客 150

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

dropDownList属性

Bootstrap是当下流行的前端UI组件库之一。利用Bootstrap,可以很方便的构造美观、统一的页面。把设计师从具体的UI编码中解放出来。   Bootstrap提供了不少的前端UI组件。带下拉菜单的文本框就是其中之一,效果图如下(真要自己完全设计,还得费一番功夫)   关于该组件的详情参看Bootstrap官网、带下拉菜单的文本框   看到上面的效果图,使我想到WinFor

朱智文的专栏 3454

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

3.2 Bootstrap 下拉菜单(Dropdowns)

本章将重点介绍 Bootstrap 下拉菜单。下拉菜单是可切换的,是以列表格式显示链接的上下文菜单。这可以通过与 下拉菜单(Dropdown) JavaScript 插件 的互动来实现。您可以使用 class dropdown-header 向下拉菜单的标签区域添加标题。内加上下拉菜单即可。来向右对齐下拉菜单。如需使用下拉菜单,只需要在 class。

梁辰兴的博客 1634

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

使用bootstrap和jQuery制作下拉输入框

总体思路: 1. 使用html的datalist标签,实现模糊查询功能。 2. 但datalist的下拉列表没有找到滚动修改的方法,故自己制作一个下拉列表,使用bootstrap的下拉菜单组件 .dropdown,并将样式保持一致,且在聚焦时停用datalist的列表。关于浏览器兼容问题,测试与datalist所支持的一致,IE 10、Firefox、Opera 和 Chrome 支持。

BigOrange的博客 2363

c#窗体添加toolStripDropDown控件,利用DropDowItem属性设置10种肤色名选项(详细步骤及代码编写)

c#窗体添加toolStripDropDown控件,利用DropDowItem属性设置10种肤色名选项

m0_63330263的博客 2231

WinForm中DropDownList默认显示设置

属性: DropDownStyle: DropDownList FlatStyle:              System ·································································  DropDownList是不可编辑的,DropDownStyle为 DropDown的时候直接在TEXT 中编辑会在控件默认显示,如

一只写bug的程序猿的博客 5050

用bootstrap做下拉菜单,并使用jQuery实现从服务器加载下拉菜单的item。

用bootstrap做下拉菜单,并使用jQuery实现从服务器异步加载下拉菜单的item。 前台代码: 设备分中心 选择

mht1829的博客 7902

DropDownList下拉菜单

DropDownList其实就是select,只有下拉选择。可以把现有的select或者input渲染成下拉菜单: <inputid="color"value="1"/> <selectid="size"> <option>S-63/4"</option> <option>M-71/4"</option> <option>L-71/8"</optio...

baiduwenku112的博客 1140

Web 版翻译者资料库

本项目是桌面版《翻译者资料库》的 Web 移植版,基于 Spring Boot 3.3、Thymeleaf、Bootstrap 5.3 与 MySQL 8.0 构建。它面向翻译写作提供资料、词汇、句库、文本工具、对照制作、查找、备份恢复及旧库迁移等功能,完整继承桌面版核心业务规则,支持一键启动与离线访问。

howard2005的专栏 144
上一篇: 使用delphi 开发多层应用(二十三)KbmMW 的WIB
下一篇: 用户IP地址的三个属性的区别(HTTP_X_FORWARDED_FOR,HTTP_VIA,REM_addr
weixin_34375233
博客等级 码龄11年 5131粉丝 137原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值