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

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

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

关于该组件的详情参看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"}
]
});

效果图:

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"
}
]
}
]
});

效果图:

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"}
]
}
]
});

效果图:

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

以上内容是小编给大家介绍的创建基于Bootstrap的下拉菜单的DropDownList的JQuery插件的全部内容,希望对大家有所帮助!

(0)

相关推荐

  • JS组件Bootstrap dropdown组件扩展hover事件

    bootstrap导航条当中dropdown组件用得特别频繁,本文就为大家介绍bootstrap中的dropdown组件扩展hover事件,具体内容如下 如何实现这个hover事件呢,其实在dropdown组件的点击事件的基础上很好完成的.细心者可以发现,下拉框出现时,其父级会有一个open的class属性.我们只需要监听hover事件时,给父级增加或删除open类就可以了. boostrap-hover-dropdown.js插件,托管在github上的代码网址:查看 下面是完整的js插件代码

  • 基于Bootstrap里面的Button dropdown打造自定义select

    最近工作非常的忙,在对一个系统进行改版.项目后台是MVC1.0开发的,但是前端部分已经改过几个版本,而已之前的设计师很强大,又做设计又做前端开发.而已很时尚和前沿,使用了一直都很热门的Bootstrap工具包,有很多把它定义为Web前端CSS框架.说实话,之前只知道它是Twitter公司出品,界面做的比较好看.但是没有在实际项目中使用,之前公司新来的同事会这个,准备在公司官网项目中使用,因为我不会,而已Leader对这个也不感冒,所以就没有用.而已她说配合Less一起做项目,可以提高开发效率,而

  • Bootstrap 下拉菜单.dropdown的具体使用方法

    本章将具体讲解下拉菜单的交互.使用下拉菜单(Dropdown)插件,您可以向任何组件(比如导航栏.标签页.胶囊式导航菜单.按钮等)添加下拉菜单. 下拉菜单.dropdown具体用法 .dropdown <下拉菜单触发器button+下拉菜单ul> .dropdown 包裹层 .dropdown-toggle 下拉菜单触发器 data-toggle="dropdown  自定义属性 可以与js关联起来 .dropdown-menu  下拉菜单 具体实例: <div class=&

  • JQuery组件基于Bootstrap的DropDownList(完整版)

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

  • Bootstrap CSS组件之下拉菜单(dropdown)

    Bootstrap下拉菜单,常用在开发项目中,今天为大家介绍介绍 dropdown.dropdown-menu.dropdown-header.divider.dropdown-submenu 例子见下拉菜单.html //源码 .dropup, .dropdown { position: relative; } .dropdown-toggle:focus { outline: 0; } .dropdown-menu { position: absolute; top: 100%; left:

  • Bootstrap下拉菜单Dropdowns的实现代码

    本文实例为大家分享了Bootstrap下拉菜单的具体代码,供大家参考,具体内容如下 <!DOCTYPE html> <html> <head> <title>Bootstrap-下拉菜单标题</title> <meta charset="utf-8"> <link rel="stylesheet" href="css/bootstrap.min.css" rel=&qu

  • bootstrap如何让dropdown menu按钮式下拉框长度一致

    bootstrap框架提供了下拉菜单组件(dropdown),即点击一个元素或按钮,触发隐藏的列表显示出来. 1.基本代码和页面展示 按钮和菜单需要包裹在.dropdown 的容器里,而作为被点击的元素按钮需要设置 data-toggle="dropdown"才能有效.对于菜单部分,设置 class="dropdown-menu"才能 自动隐藏并添加固定样式.设置 class="caret"表示箭头,可上可下. <div class=&qu

  • Bootstrap模块dropdown实现下拉框响应

    本文介绍了Bootstrap下拉框模块dropdown的使用方法,供大家参考,具体内容如下 一.源码分析: Dropdowns.scss:下拉框模块 Javascripts/bootstrap/dropdown.js:实现下拉框响应 二.功能及原理: 下拉选项卡,默认不能实现显示选中项的功能 原理: 1.利用dropdown类作为定位点,然后让子级的列表dropdown-menu绝对定位实现,还需要加一个单击点作为设置data-toggle="dropdown"才能做关联. 2. 需要

  • 详解bootstrap用dropdown-menu实现上下文菜单

    详解bootstrap用dropdown-menu实现上下文菜单 写在前面: 所谓上下文菜单,它与一般菜单的区别在于: 通过右键触发显示在鼠标右键点击处 鼠标在别处点击后,该菜单消失 实现方法: 在html中定义一个普通的没有触发条件的dropdown-menu,然后写这个menu的父容器的监听即可实现. 代码: <div id="settingInGraph"> <ul class="dropdown-menu" role="menu&

  • Bootstrap中的Dropdown下拉菜单更改为悬停(hover)触发

    在使用bootstrap制作后台时用到了响应式导航条,其中dropdown组件更是用的比较多,用的多需要点击的就多,dropdown默认鼠标左键单击才展开,如果使用鼠标放上去(hover)就展开则会省去点击时间,这样能提高效率. 原本的改造思路是:给dropdown元素绑定hover事件,hover上去的时候,执行该元素的click事件--即把hover同步为click,hover即为click. 但想到与其自己来改造,不如先在网上搜索搜索看看有没有现成的插件,果不其然就搜索到了,托管在gith

随机推荐