(原创)jquery插件-可选可填控件
;(function ($) {
$.fn.autoFillTextBox = function (options) {
var defaults = {
nShow: 5, //显示条数
nLen:10, //结果显示字数
url: "/handler/DataRequestHandler.ashx", //请求数据的url
inputCss: 'autofillbox_input', //输入框的样式
containerCss:'autofillbox_container', //外层容器的样式
selectCss:'autofillbox_select', //下拉列表的样式
delay:500, //延时查询的间隔
onSelected:function($container){}, //选择后触发的事件,供外部调用
action:'type', //请求的操作关键字
action_name:'SearchResource', //请求的操作
name_field:'Name', //查询的名字(数据库中的名字字段)
py_field:'pinyin', //查询的拼音(数据库中的拼音字段)
other_cond:{}, //其他查询条件
enable_fetch_more:true, //是否启用查找更多
do_fetch_more:function(token){}, //查找更多
container_width:0, //输入框长度
enable_blur:true, //是否允许文本框失去焦点的事件
};
var settings = $.extend(defaults, options);
var token = 0;
var mode = '';
/*
* 据配置项中的nLen来获取显示结果的缩写
*/
function _getShortName(name){
if (name == null)
return "";
if (name.length>settings.nLen)
return name.substr(0, settings.nLen)+"...";
else
return name;
}
/*
* 显示查询的结果
*/
function _showResult($container, response) {
$container.children('ul').remove();
if ((response == null || response.length == 0) && !settings.enable_fetch_more)
return;
var $ul = $("<ul></ul>").addClass(settings.selectCss);
$.each(response, function(ii, item) {
$ul.append("<li id='"+item.id+"' title='"+item.name+"' data-fullname='"+item.name+"'><a style='text-decoration:none'>" + _getShortName(item.name) + "</a></li>");
})
if (settings.enable_fetch_more){
$ul.append("<a class='fetch_more' style='text-decoration:none;cursor:pointer'><<<查找更多数据>>></a>")
}
$container.append($ul);
$ul.slideDown('slow');
$ul.on('click', 'li', function(){//TODO 此处为啥用delegate没效果
var $container = $(this).parent().parent();
_readMode($(this));
settings.onSelected($container);
});
$ul.on('click', '.fetch_more', function(){
settings.do_fetch_more(token);
mode = 'fetch_more';
})
};
/*
* 编辑模式
*/
function _editMode($img){
var $container = $img.parent();
_initInput($container);
}
/*
* 只读模式
*/
function _readMode($li){
var $container = $li.parent().parent();
var val = $li.attr('data-fullname');
var id = $li.attr('id');
_initLabel($container, id, val);
}
/*
* 撤销编辑
*/
function _redo($img){
var $container = $img.parent().parent();
_initLabel($container);
}
/*
* 执行查询
*/
function _doSearch() {
var val = $(this).val();
if (val == '')
return;
var $container = $(this).parent();
var condition = {
nameField:settings['name_field'],
pyField:settings['py_field'],
key:val,
maxItem:settings.nShow
};
condition[settings['action']] = settings['action_name'];
$.extend(condition, settings.other_cond);
$.getJSON(settings.url, condition)
.done(function (response) {
_showResult($container, _formatResponse(response))
})
.fail(function (response) {
console.log(response);//ToDo 此处应该显示错误信息,并在1s后自动消失
})
};
/*
规范化response,因为有的是返回model数组,有的是返回dataset
*/
var _formatResponse = function(response){
if ($.isArray(response)) {
return response;
}else if (response.hasOwnProperty('ds')){
return response.ds;
}else{
return [];
}
}
/*
* 延时查询
* 基本思路是,每次用户触发查询时,会重置定时器。若在定时器触发之前用户无再输入,则执行查询
*/
var _delayCall = (function() {
var timer = null;
return function (fn, delay, $input) {
clearTimeout(timer);
timer = setTimeout(function () {
fn.call($input);//使用call可以将input带入给_search函数
}, delay);
};
})();
/*
* 初始化显示结果的标签
*/
function _initLabel($container, id, val){
mode = 'read';
if (id == undefined && val == undefined){
id = $container.attr('data-id');
val = $container.attr('data-val');
}else{
$container.attr({'data-id':id, 'data-val':val});
}
$container.children().remove();
$container.append("<span title='"+val+"' style='width:85%'>"+_getShortName(val)+"</span><img title='编辑' src='/Images/icons/page_white_edit.png'/>");
$container.undelegate('img', 'click');
$container.delegate('img', 'click', function () {
_editMode($(this));
});
}
/*
* 显示撤销按钮
*/
function _showReDo($container){
if ($container.find('img').length>0)
return;
$container.children('input').after("<a class='autofillbox_button'><img title='撤销' src='/Images/icons/back.gif' /></a>");
$container.undelegate('img', 'click');
$container.delegate('img', 'click', function () {
_redo($(this));
});
}
/*
* 初始化输入的文本框
*/
function _initInput($container) {//初始化输入框
mode = 'write';
$container.children().remove();
if ($container.children().length == 0) {
var $input = $('<input type="text" class="' + settings.inputCss + '" id="autofilltextbox_x"/>');
var val = $container.attr('data-val');
$input.val(val);
$container.append($input);
}
$container.undelegate('input', 'keyup');
$container.delegate('input', 'keyup', function () {
_delayCall(_doSearch, settings.delay, this);
});
$container.undelegate('input', 'click');
$container.delegate('input', 'click', function () {
_doSearch.call(this);
});
if (settings.enable_blur){
$container.undelegate('input', 'blur');
$container.delegate('input', 'blur', function () {
var val = $(this).val();
setTimeout(function () {
_setValue($container, '', val);
}, 250);
});
}
_showReDo($container);
return $container;
}
/*
* 初始化容器
*/
function _initContainer($container) {//初始化外框CSS
// $container.css({'position':'relative'}).addClass(settings.containerCss);
$container.addClass(settings.containerCss);
$container.attr({'data-id':'', 'data-val':''});
if (settings.container_width > 0){
$container.width(settings.container_width);
}
var t = new Date();
token = t.getTime();
$container.attr('data-token', token);//生成控件的唯一标识
return $container;
}
function _setValue($container, id, val){
if (mode != 'write')
return;
$container.attr({'data-id':id, 'data-val':val});
_initLabel($container, id, val);
}
/*
* 初始化控件
*/
this.each(function () {
var _this = $(this);
_this = _initContainer(_this);//初始化外框CSS
_this = _initInput(_this);//初始化输入框
});
//-------------------------------------------公有方法----------------------------------------------------
/*
* 获取控件的token(唯一标识)
*/
this.getToken = function(){
// return $(this).attr('data-token');
return token;
};
/*
* 设置其他查询条件
*/
this.setOptions =function(options){
$.extend(true, settings, options);//$.extend的第一个参数决定了是否深度拷贝,否则other_cond就会被新的options覆盖
};
/*
* 清理选择结果
*/
this.clear = function(){
var $container = $(this);
$container.attr({'data-id':'', 'data-val':''});
_initInput($container);
};
this.setValue = function(id, val, triggerSelect){
var $container = $(this);
//$container.attr({'data-id':id, 'data-val':val});
//_initLabel($container, id, val);
_setValue($container, id, val);
if (triggerSelect){
settings.onSelected($container);
}
};
this.getSettings = function(){
return settings;
};
return this;
}
})(jQuery);
(原创)jquery插件-可选可填控件的更多相关文章
- jquery datepicker-强大的日期控件
在web开发中,总会遇到需要用户输入日期的情况.一般都是提供一个text类型的input供用户输入日期.然而,这种方式,开发人员必须对用户输入的日期进行验证,判断其合法性.除此之外,让用户输入日期也是 ...
- 原创jquery插件treeTable(转)
由于工作需要,要直观的看到某个业务是由那些子业务引起的异常,所以我需要用树表的方式来展现各个层次的数据. 需求: 1.数据层次分明: 2.数据读取慢.需要动态加载孩子节点: 3.支持默认展开多少层. ...
- jquery messagetip信息语提示控件
编写原因: 作为提示框,jquery有个messagebox的控件,也就是弹出的提示框.但这个控件如果不是用在需要确认的时候,单单警告提示.消息提示.失败提示时,用户还需要去点下确认,有时这操作还是挺 ...
- 《zw版·delphi与halcon系列原创教程》zw版_THOperatorSetX控件函数列表 v11中文增强版
<zw版·delphi与halcon系列原创教程>zw版_THOperatorSetX控件函数列表v11中文增强版 Halcon虽然庞大,光HALCONXLib_TLB.pas文件,源码就 ...
- 《zw版·delphi与halcon系列原创教程》zw版_THImagex控件函数列表
<zw版·delphi与halcon系列原创教程>zw版_THImagex控件函数列表 Halcon虽然庞大,光HALCONXLib_TLB.pas文件,源码就要7w多行,但核心控件就是两 ...
- jQuery里面的datepicker日期控件默认是显示英文的,如何显示中文或其他语言呢?
jQuery里面的datepicker日期控件默认是显示英文的,如何让他显示中文或其他呢? [官方的写法]: (1)引入JS文件: <script type="text/javascr ...
- 向大家推荐两个灰常好用的插件LigerUI和报表控件highcharts
废话不多说上一张图看看,向大家推荐两个灰常好用的插件LigerUI和报表控件highcharts.欢迎大家进技术群讨论:QQ群:15129679 http://ligerui.com/和http:// ...
- jquery文件批量上传控件Uploadify3.2(java springMVC)
人比較懒 有用为主 不怎么排版了 先放上Uploadify的官网链接:http://www.uploadify.com/ -->里面能够看到PHP的演示样例,属性说明,以及控件下载地址.分f ...
- jquery.sobox 经典版弹窗控件
sobox 是一款非常实用的,基于 jQuery 的弹窗控件.功能非常完整,而代码量又非常少(压缩完仅8k不到)的一款弹窗控件,如果你熟悉ext的弹窗控件,那么sobox的使用对你来说应该是愉悦而完全 ...
随机推荐
- wget 批量下载目录文件
wget -r -p -k -np http://源目录 ./本地目标目录
- 总结Selenium自动化测试方法(四)WebDriver常用的操作
四.WebDriver常用的操作 1.控制浏览器操作 #控制浏览器的大小 self.driver.set_window_size(480,800) #控制浏览器返回 self.driver.back( ...
- 简单理解Hibernate三种状态的概念及互相转化
本文描述了Hibernate三种状态的概念及互相转化.Java对象的生命周期中有三种状态,而且互相转化.它们分别是临时状态,持久化状态,以及游离状态. AD:WOT2015 互联网运维与开发者大会 热 ...
- java生成带html样式的word文件
参考:http://blog.csdn.net/xiexl/article/details/6652230 最近在项目中需要将通过富文本编辑器处理过的文字转换为Word,查了很久,大家通常的解决办法是 ...
- 点滴积累【JS】---JS小功能(createElement和insertBefore添加div下面的节点)
效果: 代码: <head runat="server"> <title></title> <script type="text ...
- iOS开发UITableView基本使用方法总结1
UITableView基本使用方法 1.首先,Controller需要实现两个delegate ,分别是UITableViewDelegate 和UITableViewDataSource 2.然后 ...
- 韦东山驱动视频笔记——3.字符设备驱动程序之poll机制
linux内核版本:linux-2.6.30.4 目的:我们在中断方式的按键应用程序中,如果没有按键按下,read就会永远在那等待,所以如果在这个程序里还想做其他事就不可能了.因此我们这次改进它,让它 ...
- ecshop 无限分类解析(转)
对ecshop无限级分类的解析,认真分析后发现真的其算法还是比较精典的其实并不难理解,有举例方便大家理解 function cat_options($spec_cat_id, $arr) { stat ...
- 【英语】Bingo口语笔记(19) - 如何用英语叙旧
- [转] gc tips(1)
所有应用软件都需要管理内存,一个应用软件的内存管理系统包括了如下准则:什么时候派发内存,要派发多少内存,什么时候把东西放到回收站,以及什么时候清空回收站.MMgc是Flash Player几乎所有内存 ...