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 = $(" ...
随机推荐
- 用C#实现MD5算法
/// <summary> /// 一个实现MD5散列字符串的类 /// </summary> public sealed class MD5Hash ...
- win7如何完全写在iis
在前些天,因为需要搭建了ftp服务器,但是今天不需要了,所以要卸载iis,因为我不会让iis和apache同时共存,所以只能卸载了 先找到windows功能,然后把Internet信息服务勾选掉,重启 ...
- Python的面向对象2
我们接着讲解Python的面向对象 1.初始化实例属性 在现实生活中,一种类型的实例会具有相同的某些属性,把这些实例划分为一个类型,则这些实例必然有相似的部分.但是,在创建实例之后,我们一个一个的为实 ...
- gcc向待编译源文件传入参数的方法
gcc有两种方法向待编译源文件传入参数 第一种 利用–Dmacro=name 编译选项,详见gcc -D选项 第二种 利用链接脚本(*.lds)传入参数,类似于ADS的编译器参数可以被待编译源文件调用 ...
- Keil的c语言编译器
我曾经通过查看反汇编代码对KEILC编译器进行了测试,大概有这么一下内容,也得出一些结论. (1)全局变量:如果程序中定义了全局变量,而且初始值不是0.此时,在程序调到main()函数执行前,除了要进 ...
- HDU 1166 敌兵布阵 线段树的基本应用——动态区间和问题
题目: http://acm.hdu.edu.cn/showproblem.php?pid=1166 简单题,1A了,这个好像就是传说中的“点树”. 设当前结点表示线段[left, right],编号 ...
- Ubuntu下Memcache的安装与基本使用
安装Memcache Memcache分为两部分,Memcache服务端和客户端.Memcache服务端是作为服务来运行的,所有数据缓存的建立,存储,删除实际上都是在这里完成的.客户端,在这里我们指的 ...
- PhoneGap 3 在 Mac 上安装使用
1.下载安装 NodeJS . 2.安装 PhoneGap.打开终端执行: 1 $ sudo npm install -g phonegap 3.PhoneGap 3 不需要在Xcode中创建,而是在 ...
- 【Tools】Pro Git 一二章读书笔记
记得知乎以前有个问题说:如果用一天的时间学习一门技能,选什么好?里面有个说学会Git是个很不错选择,今天就抽时间感受下Git的魅力吧. Pro Git (Scott Chacon) 读书笔记: ...
- SPRING IN ACTION 第4版笔记-第二章WIRING BEANS-008-在Java配置文件中引入xml配置文件@Import、@ImportResource
1. package soundsystem; import org.springframework.beans.factory.annotation.Autowired; public class ...