自制jQuery标签插件
在项目中需要一个添加标签的小插件,查看了一些已有插件后,发现很现成的高级插件,也有比较简单的插件。最后还是决定自己来写,这样能控制代码,以后与其他插件结合使用的时候能更好的把控。初步在IE6 7 8,firefox,chrome中做了测试,可以通过。
我是仿照163邮箱中添加邮箱的方式写的,插件如下:
aaarticlea/png;base64,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" alt="" />
一、制作静态效果
先用html和css做出个样子出来,然后再根据样式来做动态效果。
<h2 style="padding:10px">静态效果</h2>
<label class="jtag_error">5424@qq</label>
<label class="jtag_error jtag_error_hover">5dasdasdasdq</label>
<label class="jtag_error jtag_error_active">5dasdasq</label>
<label class="jtag_correct">pwstrick@163.com</label>
<label class="jtag_correct_hover jtag_correct">peach@163.com</label>
<label class="jtag_correct_active jtag_correct">peach@163.com</label>
<input type="text" class="jtag_input"/><span style="color:#666;font-size:.75em">多个标签请用分号分开,双击已完成标签可做修改</span>
aaarticlea/png;base64,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" alt="" />
标签有三种样式,依次是普通样式,第二种是:hover移上去的样式,第三种是选中的样式;两种状态的标签,一种是符合规则的标签,另外一种是不符合要求的标签,上面的规则是邮箱格式。
.jtag_correct{
border:1px solid #c2d4e3;padding:5px 8px;font-size:.75em;background:#e8f0f7;
color:#7f7f7f;margin-right:5px;cursor:pointer;display:inline-block;vertical-align:middle
}
.jtag_correct_hover{border-color:#cbdeee;color:#6d92b8;background:#cbdeee}
.jtag_correct_active{border-color:#2d59b3;color:#fff;background:#0f6099}
.jtag_error{
border:1px solid #edb8b8;padding:5px 8px;font-size:.75em;background:#ffeaea;
color:#c30;margin-right:5px;cursor:pointer;display:inline-block;vertical-align:middle
}
.jtag_error_hover{border-color:#e0aaaa;color:#b10b2c;background:#fddcdc}
.jtag_error_active{border-color:#dc9c9c;color:#fff;background:#ee4d4d}
.jtag_input{border:;vertical-align:middle;width:50px}
1、标签我就用label表示,设置成display:inline-block,这样控制对齐比较方便,宽度未定,用padding把整个块给撑开,字体大小用了em单位
2、标签与输入框之间的上下对齐用vertical-align:middle解决
3、为了简单一点,我将input输入框与label标签设为兄弟关系
4、correct是指符合规则的样式,error是指不符合规则的样式,hover是移到标签上的样式,active是选中标签的样式
5、把输入框隐藏掉
二、插件格式
;(function (factory) {
'use strict';
// Register as an AMD module, compatible with script loaders like RequireJS.
if (typeof define === 'function' && define.amd) {
define(['jquery'], factory);
}
else {
factory(jQuery);
}
}(function ($, undefined) {
'use strict'; $.fn.jtag = function (method) { };
}));
1、第一个分号是为了防止在与其他代码压缩到一起的时候合在一行中,这样会出现语法错误。例如var i=0(function(factory){......}(..);
2、'use strict'是开启严格模式,使Javascript解释器可以用"严格"的语法来解析代码,以帮助开发人员发现错误
3、如果使用了requirejs模块载入框架,define(['jquery'], factory)这句就是让插件支持AMD规范
4、function ($, undefined) 这里面的undefined是为了防止在引入其他js文件的时候,使用被重写了的undefined
三、设置常量
var keys = {
BACKSPACE: 8,
DELETE: 46,
DOWN: 40,
END: 35,
ENTER: 13,
HOME: 36,
LEFT: 37,
RIGHT: 39,
UP: 38,
SEMICOLON1: 186,
SEMICOLON2: 59
}; var defaults = {
inputCss : 'jtag_input',
tagErrorCss : 'jtag_error',
tagErrorHoverCss : 'jtag_error_hover',
tagErrorActiveCss : 'jtag_error_active',
tagCorrectCss : 'jtag_correct',
tagCorrectHoverCss : 'jtag_correct_hover',
tagCorrectActiveCss : 'jtag_correct_active',
regexInput : ''
};
1、keys里面定义了键盘的码,SEMICOLON1和SEMICOLON2是指分号,firefox,IE对于分号的码有点不同
2、defaults是插件的默认参数
inputCss |
输入框样式 |
tagErrorCss |
标签不符合规则样式 |
tagErrorHoverCss |
标签不符合规则移上去样式 |
tagErrorActiveCss |
标签不符合规则选中样式 |
tagCorrectCss |
标签符合规则样式 |
tagCorrectHoverCss |
标签符合规则移上去样式 |
tagCorrectActiveCss |
标签符合规则选中样式 |
regexInput |
标签的正则验证规则 |
四、初始化
/**
* @method private
* @name _init
* @description Initializes plugin
* @param opts [object] "Initialization options"
*/
function _init(opts) {
opts = $.extend({}, defaults, opts || {});
// Apply to each element
var $items = $(this);
for (var i = 0, count = $items.length; i < count; i++) {
_build($items.eq(i), opts);
}
return $items;
}
/**
* @method private
* @name _build
* @description Builds each instance
* @param $node [jQuery object] "目标对象"
* @param opts [object] "插件参数"
*/
function _build($node, opts) {
$node.addClass(opts.inputCss);
// Store plugin data
var data = $.extend({
$node: $node
}, opts);
data.$node.on("keyup.jtag", data, _onKeyup)
.on("keydown.jtag", data, _onKeydown)
.on("blur.jtag", data, _onBlur);
}
$.fn.jtag = function () {
return _init.apply(this, arguments);
};
1、_init是做初始化操作,先是将传入的插件参数与默认的参数合并起来,然后做创建
2、$('.class').jtag()的时候会匹配多个元素,_init中有个for循环,用于将这多个元素创建插件
3、插件定义的时候将_init函数apply一下,这样可以将函数中的上下文this设置为插件对象
4、_build中先给输入框一个样式,然后将输入框对象与插件参数合并,传入到下面_onKeyup几个方法中
5、使用on方法,在选择元素上绑定事件,keyup.jtag分别是事件类型与命名空间,第二个参数data会作为event的一个属性传递给事件处理函数
五、输入框事件
输入框绑定了三种事件,keyup、keydown和blur
1)keyup是在输入框中当按钮被松开时发生的事件
1.只要输入分号(;)就将输入框中的内容添加为标签,如果输入框中没有内容就不会创建标签
2.按键盘中的上与左建能够选中前面的标签,前置条件是焦点必须是在输入框中
3.按键盘中的下与右建能够选中后面的标签,前置条件是焦点必须是在输入框中
4.输入框中只要有内容,所有标签的选中样式就要移除
/**
* @method private
* @name _onKeyup
* @description 按下某个按钮后发生的事件,输入框中内容已改变
* @param e [jQuery object] "Event data"
*/
function _onKeyup(e) {
var data = e.data;
var code = _getKeyCode(e);
var $input = data.$node;
//当输入框中有内容时候要移除选中标记
if($input.val().length > 0)
_removeSelected($input, data);
switch(code) {
//case keys.ENTER:
case keys.SEMICOLON1:
case keys.SEMICOLON2:
_addTag($input, data);//输入法直接回车就增加了
break;
case keys.LEFT:
case keys.UP:
_selectPrev($input, data);
break;
case keys.RIGHT:
case keys.DOWN:
_selectNext($input, data);
break;
}
}
2)keydown是当键盘或按钮被按下时的事件
这个事件是为了删除选定标签而设置的,原先是放在keyup中,但是有个问题,就是当用backspace键删除输入框中的内容的时候,输入到最后一个字符的时候会同时把输入框旁边的标签也一并删除掉。后面就改用了keydown事件。
/**
* @method private
* @name _onKeydown
* @description 按下某个按钮后发生的事件,输入框中内容未改变
* @param e [jQuery object] "Event data"
*/
function _onKeydown(e) {
var data = e.data;
var code =_getKeyCode(e);
switch(code) {
case keys.BACKSPACE:
case keys.DELETE:
_delSelectedTag(data);
break;
}
}
3)blur是当元素失去焦点时触发时的事件
输入框失去焦点后,将内容直接设置为标签,并将所有标签的选中状态移除。
/**
* @method private
* @name _onBlur
* @description 失去焦点的时候
* @param e [jQuery object] "Event data"
*/
function _onBlur(e) {
var opts = e.data;
_removeSelected(opts.$node, opts);
_addTag(opts.$node, opts);
}
六、标签内容规则验证与过滤
在参数中有一个参数是正则,用于验证的,这个规则将会在好几个地方用到,所以我放到了一个私有函数中。没几行,不过里面有一个坑,就是正则的test方法,一开始不理解它,后面就发生了奇怪的问题,就是这个规则验证同一个内容,有时候是通过的有时候却不能通过,最后搜索后,发现test会改变lastIndex的值,导致有时候对有时候不对。
/**
* @method private
* @name _validate
* @description 根据正则表达式检验标签格式
* @param value [string] "标签值"
* @param opts [object] "插件参数"
*/
function _validate(value, opts) {
if(opts.regexInput) {
opts.regexInput.lastIndex=0;//test会修改lastIndex的值
return opts.regexInput.test(value);
}
return true;
}
输入框中输入分号也会生成标签,这个分号可以是英文输入法的也可是中文输入法的,在生成标签的时候,我会过滤掉分号,这里用了replace,这地方也有一个坑,就是replace中不用正则的过滤规则,只是用字符串来做,只会把第一个匹配的过滤掉,后面的还是会存在,例如replace(';', '')。
/**
* @method private
* @name _filter
* @description 过滤输入值
* @param value [string] "标签内容"
*/
function _filter(value) {
return value.replace(/[;;]/g, '');//replace要替换所有的需要用正则
}
七、生成标签
生成的标签将会给它绑定hover、click和dblclick事件
标签click后,会添加选中样式,并将焦点设置为输入框,这样才能使用键盘中的上下左右键做操作
标签dblclick后,即双击,会将标签变成一个输入框,给这个输入框绑定了keyup与blur事件,keyup实现输入框长度自适应,blur后将再次生成标签
/**
* @method private
* @name _generateTag
* @description 新增一个正确或错误的标签
* @param value [string] "标签内容已过滤空白"
* @param opts [object] "插件参数"
* @param $input [jQuery object] "定义为插件的输入框对象,不能为标签双击后生成的输入框"
* @return $tag [object] 动态生成的标签
*/
function _generateTag(value, opts, $input) {
var $tag, css, hover, active;
if(_validate(value, opts)) {//验证或无验证
css = opts.tagCorrectCss;
hover = opts.tagCorrectHoverCss;
active = opts.tagCorrectActiveCss;
}else {
css = opts.tagErrorCss;
hover = opts.tagErrorHoverCss;
active = opts.tagErrorActiveCss;
}
var $tag = $('<label class="'+css+'">'+value+'</label>').bind('hover', function(e) {
e.type == 'mouseenter' ? $(this).addClass(hover) : $(this).removeClass(hover);
}).bind('click', function() {
_removeSelected($input, opts);//移除兄弟标签选中状态
$(this).addClass(active);//选中class添加
//输入框中有内容的就直接添加为标签
_addTag($input, opts);
$input.focus();//将输入框为选中状态,不选中按backspace会回退网页
}).bind('dblclick', function() {//双击变为修改状态
var text = $(this).text();
var $text = $('<input type="text"/>').css({border:0, marginRight:5}).attr('size', text.length+2).val(text).bind('blur', function() {
_addTag($(this), opts);
$(this).remove();
$input.focus();
}).bind('keyup', function() {//输入框宽度自适应
$(this).attr("size", $(this).val().length + 5);
}); $(this).before($text);
$(this).remove();
$text.focus();
});
return $tag;
}
好了,就这么多了,代码比上一个插件可编辑的下拉框多了6倍多,这个插件里还有很多BUG存在,大家可以自己来改,如果发现了BUG的的话,就请告诉我一下啊^ ^
demo下载:
http://download.csdn.net/download/loneleaf1/7812909
自制jQuery标签插件的更多相关文章
- 覆盖alert对话框-自制Jquery.alert插件
Javascript 代码: (function ($) { 'use strict'; window.alert = $.alert = function (msg) { var defaultOp ...
- jQuery标签插件tagsinput.js
官网地址: http://xoxco.com/projects/code/tagsinput/ github地址: https://github.com/xoxco/jQuery-Tags-Input ...
- TaggingJS – 可以灵活定制的 jQuery 标签系统插件
TaggingJS 是一款 jQuery 插件,用来创建高度可定制的前端标签系统.这款插件不到3KB ,支持主流浏览器.有几种方法来定制 TaggingJS 的默认行为:一是使用 custom_op ...
- jQuery 浮动标签插件,帮助你提升表单用户体验
浮动标签模式(Float Label Pattern)是最新流行的一种表单输入域的内容提示方式,当用户在输入框输入内容的时候,原先占位符的内容向上移动,显示在输入的内容的上面.这里推荐的这款 jQue ...
- BootStrap入门教程 (四) :JQuery类库插件(模态窗口,滚动监控,标签效果,提示效果,“泡芙”效果,警告区域,折叠效果,旋转木马,输入提示)
上讲回顾:Bootstrap组件丰富同时具有良好可扩展性,能够很好地应用在生产环境.这些组件包括按钮(Button),导航(Navigation),缩略图( thumbnails),提醒(Alert) ...
- win8 tiles风格标签插件jquery.wordbox.js
http://www.html580.com/12180 jquery.wordbox.js轻松实现win8瓦片tiles式风格标签插件,只需要调用JS就能轻松实现瓦片菜单,自定义菜单背景颜色,支持响 ...
- 使用jQuery.form插件,实现完美的表单异步提交
传送门:异步编程系列目录…… 时间真快,转眼一个月快结束了,一个月没写博客了!手开始生了,怎么开始呢…… 示例下载:使用jQuery.form插件,实现完美的表单异步提交.rar 月份的尾巴,今天的主 ...
- bootstrap-简洁实用的jQuery手风琴插件
前端 <html lang="zh"> <head> <meta charset="UTF-8"> <meta htt ...
- 让网站动起来!12款优秀的 jQuery 动画插件推荐
如今,大多数设计师和开发人员被要客户要求开发动态的网站.创造视觉震撼和醒目的动态网站是艰巨的任务,因为它需要大量的努力和创造力.在网络上有大量的工具和插件可用于创建网站动画.许多开发人员正在使用 HT ...
随机推荐
- JSP中<base href="<%=basePath%>">作用
通常在JSP页面开通有如下代码: <% String path = request.getContextPath(); String basePath = request.getScheme() ...
- PHP中实现MySQL嵌套事务的两种解决方案
PHP中实现MySQL嵌套事务的两种解决方案 一.问题起源 在MySQL的官方文档中有明确的说明不支持嵌套事务: Transactions cannot be nested. This is a co ...
- JS继承模式粗探
之前提到了JS中比较简单的设计模式,在各种设计模式中被最常使用的工具之一就是原型链的继承.作为OOP的特质之一——继承,今天主要谈谈JS中比较简单的继承方法. 最基础的原型链继承在这里就不复述了,主要 ...
- Android JIT实时编译器的设置
在Android JIT实时编译是在Android 2.2之后才引入的,JIT编译器可以显著的提高机器的性能,经过测试,android 2.2的性能较android 2.1提高了 2-5倍.JIT提 ...
- Zookeeper初次使用
下面介绍Linux系统中Zookeeper的初次使用方法. 1.jdk安装和zookeeper下载 首先从jdk官网中下载jdk文件,然后将文件放在/usr/local/java目录下解压,并打开.b ...
- Deploying JRE (Native Plug-in) for Windows Clients in Oracle E-Business Suite Release 12 (文档 ID 393931.1)
In This Document Section 1: Overview Section 2: Pre-Upgrade Steps Section 3: Upgrade and Configurati ...
- Yii2 中自定义实例名称
Yii2高级模板中,以frontend 和backeend的模式来分离前后台,这样的优势是 工程可以独立开发和部署.很大程度上起到解耦作用. 如果我们希望再增加名为 [api]一个过程怎么办? 第一步 ...
- Intel VT-x 基本概念
看IaaS 资料时,捎带研究下硬件虚拟化,主要参考<基于intel VT-x 的Xen 全虚拟化实现>,<intel 开发手册 第三卷 19/20章> Intel VT 是in ...
- Linux 网络编程(IO模型)
针对linux 操作系统的5类IO模型,阻塞式.非阻塞式.多路复用.信号驱动和异步IO进行整理,参考<linux网络编程>及相关网络资料. 阻塞模式 在socket编程(如下图)中调用如下 ...
- 将Win8.1/WP8.1应用迁移到Universal Windows Platform
在上一篇在VS2015 RC打开CTP中创建的工程,我们介绍了怎么在RC中打开CTP中创建的Universal 工程,这一篇我们来讲下怎么将Windows 8.1/WP8.1的应用迁移到Univers ...