html自定义checkbox、radio、select —— select篇
上一篇《html自定义checkbox、radio、select —— checkbox、radio篇》介绍了我们是怎么将 html 自带的 checkbox、radio 改成我们自定义的UI的,现在来说说怎么将 html 自带的 select 改成我们自定义的UI(由于时间关系,我们只完成了单选部分的转换,而多选部分的转换没做,后续会找个时间补上)。
select 跟 checkbox、radio 方法大致相同。在 Bootstrap 中,有一个"按钮式下拉菜单"的组件,我们是在这个基础上进行修改的。
效果:

结构大致是:
<div>
<button>
<ul>
</div>
<select>
其中,<div>包住的就是展示出来的UI,<button>是正常情况下显示的,<ul>是各个选项,<select>是隐藏的。
首先,<button>使用 Bootstrap 中 "btn dropdown-toggle" 样式,并为其添加<span>、<i>标签用来显示文字和下拉的图标,我们有对部分 ".dropdown-" 相关的样式做了扩展和改写。
var $button = $('<button>', { type: 'button', 'class': 'btn dropdown-toggle', 'data-toggle': 'dropdown' })
.append($('<span>', { 'class': 'text-left pull-left' }))
.append($('<i>', { 'class': 'caret pull-right' }))
.click(function () {
$button.dropdown();
return $button;
});
接着,将<select>中的各个选项加进<ul>中,使用<a>保存 value 和 text,并添加 click 事件。
var $selectALink;
var _addOption = function ($option, inGroup) {
var $aLink = $('<a>', { href: 'javascript:void(0)', 'data-value': $option.val(), html: $option.html() === '' ? ' ' : $option.html() })
.click(function () {
if (!$aLink.data('disabled')) {
_setSelectValue($wrapper, $aLink);
$ul.scrollTop($aLink[0].offsetTop - 1); $select.trigger('change'); if ($.validator)
$select.valid();
} return $aLink;
});
inGroup && $aLink.addClass('groupopt');
$option.attr('disabled') && $aLink.addClass('disabled').data({ disabled: true });
$option.attr('selected') && ($selectALink = $aLink); $ul.append($('<li>').append($aLink));
} var $ul = $('<ul>', { 'class': 'dropdown-menu' });
$select
.children()
.each(function () {
var $obj = $(this);
if ($obj.is('optgroup')) {
$ul.append(
$('<li>').append(
$('<label>', { 'class': 'optgroup', html: $obj.attr('label') })
)
);
$('option', $obj).each(function () {
_addOption($(this), true);
});
} else if ($obj.is('option')) {
_addOption($obj);
}
});
然后将<button>、<ul>装进<div>中,隐藏<select>,设置初始值,再做一些调整,就可以看到这种效果了:

对于我们来说,做麻烦的就是当使用 JQ 控制显示隐藏(hide()、show())的时候,修改的<select>也要跟着变化。说以我们只能重写 JQ 的 hide()、show() 方法。
首先对 <select> 添加对应处理方法:
$select
.addClass('hide')
.data({ transformed: true })
.on({
hide: function () {
$wrapper.hide();
_setSelectStatus($select);
},
show: function () {
$wrapper.show();
_setSelectStatus($select);
},
transformReset: function () {
$('option', $select).not(_$defaultSelected.attr({ selected: true })).attr({ selected: false });
$select.transformResetStatus();
}
});
同 checkbox、radio,transformReset() 方法也是用于表单重置的。
接着,重写 JQ 的 hide()、show() 方法,而我们的目的是新方法仅对 <select> 有效,而其他标签依旧使用旧方法,所以:
var _oldhide = $.fn.hide;
var _oldshow = $.fn.show;
$.fn.hide = function (speed, callback) {
if (this.is('select') && this.data('transformed')) {
this.trigger('hide');
} else {
_oldhide.apply(this, arguments);
}
return this;
};
$.fn.show = function (speed, callback) {
if (this.is('select') && this.data('transformed')) {
this.trigger('show');
} else {
_oldshow.apply(this, arguments);
}
return this;
};
至此,整个改造过程大体完成,测试也能通过。
但是后来又有问题了,就是用 JQ 改变 checkbox、radio、select 的值的时候,显示的东西不会随着变。
尝试了很多方法,想实现自动同步的效果,但是都失败了了。后来,我们只能在代码里,手动同步了,即在修改后,再调用一个方法来同步:
$.fn.transformResetStatus = function () {
return this.each(function () {
var $obj = $(this);
if ($obj.is('input')) {
$obj.data('transformed') && _setInputStatus($obj);
} else if ($obj.is('select')) {
$obj.data('transformed') && _setSelectStatus($obj);
}
});
};
好了,3个标签的改造已经完成了。大家可以试试 Demo,在 IE8、9、chrome、ff 上测试通过,其他没测过。
demo 可能写得不够好,插件也可能存在一些问题我还没发现的,请发现任何问题都跟我说一下,谢谢各位!
另:要请教各位怎么把文件放在网盘上,然后直接 copy 出文件路径,今天试过115、百度、腾讯的,都不能直接 copy,都是只能引到另一个页面下载。
html自定义checkbox、radio、select —— select篇的更多相关文章
- jquery 获取和设置 checkbox radio 和 select option的值?
============== 获取和设置 checkbox radio 和 select的值? === val()函数, 其名字就表达了 它的意思: 他就是= value 的简写! val就是valu ...
- 自定义checkbox/radio
一. label标签 1. 概念: HTML <label>元素表示用户界面中项目的标题.它通常关联一个控件,或者是将控件放置在label元素内,或者是用作其属性.这样的控制称作label ...
- CSS之checkbox&radio&textarea&select
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 自定义checkbox,radio样式
input[type=radio] { margin-right: 5px; cursor: pointer; font-size: 14px; width: 15px; height: 15px; ...
- jquery的checkbox,radio,select等方法总结
jquery的checkbox,radio,和select是jquery操作的一个难点和重点,很多前端新手对其了解不是很透彻.时间久了不用,我在写的时候有时也难免对某些操作支支吾吾,记不清楚,现在,对 ...
- html自定义checkbox、radio、select —— checkbox、radio篇
前些日子,所在公司项目的UI做了大改,前端全部改用 Bootstrap 框架,Bootstrap的优缺点在此就不详述了,网上一大堆相关资料. 前端的设计就交给我和另一个同事[LV,大学同班同学,毕业后 ...
- struts2学习笔记之表单标签的详解:s:checkbox/radio/select/optiontransferselect/doubleselect/combobox
struts2中的表单标签都是以s标签的方式定义的,同时,struts2为所有标签都提供了一个模板,C:\Users\180172\Desktop\struts2-core-2.2.1.1.jar\t ...
- css自定义 range radio select的样式滑轮,按钮,选择框
写在前面: 之前踩坑css的时候,遇到滑轮,按钮,选择框这类型的东西,为了页面效果,总是需要自定义他们的样式,而不使用他们的默认样式.当时写的时候,我也是蛮头疼的,弄了个demo,链接在下面.对此做个 ...
- easyui 》 radio取值,checkbox取值,select取值,radio选中,checkbox选中,select选中
获取一组radio被选中项的值var item = $('input[@name=items][@checked]').val();获取select被选中项的文本var item = $(" ...
随机推荐
- nodejs -mysql模块链接数据库创建库创建表单。
var mysql = require('mysql'); var connection= mysql.createConnection({ host:'localhost', user:'root' ...
- 怎么样调试正在运行的exe?
最近在调虚幻的编辑器的时候遇到了一个问题. 调试模式运行UE4Editor.exe 实际上只是一个带参的命令行. 打开后,它又通过这个参数生成了一份详细配置,重新调用了自己.如图 这就悲剧了,断点都没 ...
- notepad++ :正则表达式系统教程
前言&索引 前言 正则表达式是烦琐的,但是强大的,学会之后的应用会让你除了提高效率外,会给你带来绝对的成就感.只要认真去阅读这些资料,加上应用的时候进行一定的参考,掌握正则表达式不是问题. 索 ...
- linux重新增加硬盘容量
1.先用df -h查看硬盘使用情况 2.fdisk -l查看分区情况 表示还没有挂载 3.fdisk /dev/vdb进行分区 4.mkfs.ext3 /dev/vdb进行格式化 5.mount /d ...
- 回答了个问题,9x9 乘法表生成器
# -*- coding: utf-8 -*- from prettytable import PrettyTable pt = PrettyTable() # 需要安装prettytable这个库来 ...
- iOS开发之本地化
一.简介 * 使用本地化功能,可以轻松地将应用程序翻译成多种语言,甚至可以翻译成同一语言的多种方言 * 如果要添加本地化功能,需要为每种支持的语言创建一个子目录,称为”本地化文件夹”,通常使用.lpr ...
- memcached-win32-1.4.4-14 help doc
memcached-win32-1.4.4-14 cmd打开命令窗口,转到解压的目录,输入 “memcached.exe -d install”. 使用telnet命令 验证缓存服务器是否可用.tel ...
- Freemarker 对null值报错的处理
忽略null值 假设前提:user.name为null ${user.name},异常 ${user.name!},显示空白 ${user.name!'vakin'},若user.name不为空则显示 ...
- 编写优质嵌入式C程序
前言:这是一年前我为公司内部写的一个文档,旨在向年轻的嵌入式软件工程师们介绍如何在裸机环境下编写优质嵌入式C程序.感觉是有一定的参考价值,所以拿出来分享,抛砖引玉. 转载请注明出处:http://bl ...
- VC下载文件 + 显示进度条
在codeproject里找了许久,发现这样一个VC下载文件并显示进度条的源码,于是添加了些中文注释: 1.下载线程函数: UINT DownloadFile(LPVOID pParam) { CWn ...