;(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插件-可选可填控件的更多相关文章

  1. jquery datepicker-强大的日期控件

    在web开发中,总会遇到需要用户输入日期的情况.一般都是提供一个text类型的input供用户输入日期.然而,这种方式,开发人员必须对用户输入的日期进行验证,判断其合法性.除此之外,让用户输入日期也是 ...

  2. 原创jquery插件treeTable(转)

    由于工作需要,要直观的看到某个业务是由那些子业务引起的异常,所以我需要用树表的方式来展现各个层次的数据. 需求: 1.数据层次分明: 2.数据读取慢.需要动态加载孩子节点: 3.支持默认展开多少层. ...

  3. jquery messagetip信息语提示控件

    编写原因: 作为提示框,jquery有个messagebox的控件,也就是弹出的提示框.但这个控件如果不是用在需要确认的时候,单单警告提示.消息提示.失败提示时,用户还需要去点下确认,有时这操作还是挺 ...

  4. 《zw版·delphi与halcon系列原创教程》zw版_THOperatorSetX控件函数列表 v11中文增强版

    <zw版·delphi与halcon系列原创教程>zw版_THOperatorSetX控件函数列表v11中文增强版 Halcon虽然庞大,光HALCONXLib_TLB.pas文件,源码就 ...

  5. 《zw版·delphi与halcon系列原创教程》zw版_THImagex控件函数列表

    <zw版·delphi与halcon系列原创教程>zw版_THImagex控件函数列表 Halcon虽然庞大,光HALCONXLib_TLB.pas文件,源码就要7w多行,但核心控件就是两 ...

  6. jQuery里面的datepicker日期控件默认是显示英文的,如何显示中文或其他语言呢?

    jQuery里面的datepicker日期控件默认是显示英文的,如何让他显示中文或其他呢? [官方的写法]: (1)引入JS文件: <script type="text/javascr ...

  7. 向大家推荐两个灰常好用的插件LigerUI和报表控件highcharts

    废话不多说上一张图看看,向大家推荐两个灰常好用的插件LigerUI和报表控件highcharts.欢迎大家进技术群讨论:QQ群:15129679 http://ligerui.com/和http:// ...

  8. jquery文件批量上传控件Uploadify3.2(java springMVC)

    人比較懒  有用为主 不怎么排版了 先放上Uploadify的官网链接:http://www.uploadify.com/  -->里面能够看到PHP的演示样例,属性说明,以及控件下载地址.分f ...

  9. jquery.sobox 经典版弹窗控件

    sobox 是一款非常实用的,基于 jQuery 的弹窗控件.功能非常完整,而代码量又非常少(压缩完仅8k不到)的一款弹窗控件,如果你熟悉ext的弹窗控件,那么sobox的使用对你来说应该是愉悦而完全 ...

随机推荐

  1. ubuntu中apt-get安装与默认路径

    一.apt-get 安装 deb是debian linus的安装格式,跟red hat的rpm非常相似,最基本的安装命令是:dpkg -i file.deb或者直接双击此文件 dpkg 是Debian ...

  2. 聚合函数字段注意.where和having的区别

    当使用聚合函数时,出现在select中的字段要么出现在聚合函数里,要么出现在group by 子句里.像下面这句是错误的: 1 SELECT  detno,AVG(sal),job FROM  emp ...

  3. Linux进程控制(二)

    1. 进程的创建 Linux下有四类创建子进程的函数:system(),fork(),exec*(),popen() 1.1. system函数 原型: #include <stdlib.h&g ...

  4. Machine Learning for hackers读书笔记(一)使用R语言

    #使用数据:UFO数据 #读入数据,该文件以制表符分隔,因此使用read.delim,参数sep设置分隔符为\t #所有的read函数都把string读成factor类型,这个类型用于表示分类变量,因 ...

  5. ASP.NET MVC+EasyUI+Entity FrameWork 整合开发

    本文详细讲解怎么用ASP.NET MVC+EasyUI+Entity FrameWork 来开发一个项目 对于ASP.NET MVC的Jscript库,主要引用 <script type=.mi ...

  6. office编程必不可少 [转]

    1. 微软官方实例: 段落.表格.图表 HOW TO:利用 Visual C# .NET 使 Word 自动新建文档 2. 学习资源 (1)Word in the Office 基础知识,必读,下面的 ...

  7. XenServer6.2详细安装步骤

    系统要求 系统要求 XenServer 至少需要两台单独的 x86 物理计算机:一台用作 XenServer 主机,另一台用于运行XenCenter 应用程序. XenServer 主计算机完全专用于 ...

  8. WEBUS2.0 In Action - 搜索操作指南 - (2)

    上一篇:WEBUS2.0 In Action - 搜索操作指南(1) | 下一篇:WEBUS2.0 In Action - 搜索操作指南(3) 2. 使用Query Query是所有查询的基类, 它一 ...

  9. POJ 2594 Treasure Exploration (可相交最小路径覆盖)

    题意 给你张无环有向图,问至少多少条路径能够覆盖该图的所有顶点--并且,这些路径可以有交叉. 思路 不是裸的最小路径覆盖,正常的最小路径覆盖中两个人走的路径不能有重复的点,而本题可以重复. 当然我们仍 ...

  10. android layoutparams应用指南(转)

    LayoutParams相当于一个Layout的信息包,它封装了Layout的位置.高.宽等信息.假设在屏幕上一块区域是由一个Layout占领的,如果将一个View添加到一个Layout中,最好告诉L ...