;(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. 域用户直接登陆(C#,MVC)

    域用户直接登陆MVC网页,未做测试,待测试后进行细化和补充 1. 服务器与客户端必须在同一个域名下. 2. WEB.CONFIG文件中的身份验证方式,使用Windows身份验证: 3. IIS的网站属 ...

  2. Simple Factory vs. Factory Method vs. Abstract Factory【简单工厂,工厂方法以及抽象工厂的比较】

    I ran into a question on stackoverflow the other day that sort of shocked me. It was a piece of code ...

  3. find a filename from a filehandle in Perl

    my $filename='/tmp/tmp.txt';open my $fh, '>', $filename;my $fd = fileno $fh;print readlink(" ...

  4. JAVA设计模式之【简单工厂模式】

    1.创建抽象类User public abstract class User // 抽象类 { public void sameOperation() { System.out.println(&qu ...

  5. (转载)UITableView使用详解

    在开发iphone的应用时基本上都要用到UITableView,这里讲解一下UITableView的使用方法及代理的调用情况 UITableView使用详解 - (void)viewDidLoad { ...

  6. mysql笔记(前面自己写的不标准有些地方)

    day15-MySQL 数据库 1 数据库概念(了解) 1.1 什么是数据库 数据库就是用来存储和管理数据的仓库! 数据库存储数据的优先: l  可存储大量数据: l  方便检索: l  保持数据的一 ...

  7. cakephp之查询

    find public find( string $type 'first' , array $query array() ) Queries the datasource and returns a ...

  8. linux vim 配置文件(高亮+自动缩进+行号+折叠+优化)

    点评:将一下代码copy到 用户目录下 新建文件为 .vimrc保存即可生效 如果想所有用户生效 请修改 /etc/vimrc (建议先cp一份)"===================== ...

  9. 【转】DB2 常用命令

    1. 打开命令行窗口  #db2cmd 2. 打开控制中心  # db2cmd db2cc 3. 打开命令编辑器  db2cmd db2ce =====操作数据库命令===== 4. 启动数据库实例  ...

  10. 【转】【iOS系列】-iOS查看沙盒文件图文教程(真机+模拟器)

    原文网址:http://www.cnblogs.com/fengtengfei/p/5090276.html 1:模拟器 1.1 方法1: 程序中打印一下的地址,能直接前往沙盒路径. NSString ...