;(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. 加密解密(7)*PKI基础知识(完整)

    PKI 基础知识 摘要 本白皮书介绍了加密和公钥基本结构(PKI)的概念和使用 Microsoft Windows 2000 Server 操作系统中的证书服务的基础知识.如果您还不熟悉加密和公钥技术 ...

  2. 使用 httpkit 来替代 jetty

    Compojure 是一个基于 ring 的上层web开发框架.在 lein new compojure my-app 生成的项目中,默认是启用 jetty 服务器的,最近用到了 http-kit 中 ...

  3. Android开源库--Universal Image Loader通用图片加载器

    如果说我比别人看得更远些,那是因为我站在了巨人的肩上.   github地址:https://github.com/nostra13/Android-Universal-Image-Loader 介绍 ...

  4. Android开发之PopupWindow

      /* *  Android开发之PopupWindow * *  Created on: 2011-8-8 *  Author: blueeagle *  Email: liujiaxiang@g ...

  5. 浏览器兼容的css hack

    <style> div{ background:green; /* for firefox */ *background:red; /* for IE6 */ } </style&g ...

  6. Asp.Net保存session的三种方法

    C#中保存Session的三种方法及Web.Config设置 1.保存session到sql server,需要指定Sql Server服务器,这种方法因为要读写数据库最慢 <sessionSt ...

  7. Matlab中plot函数参数解析

    功能 二维曲线绘图 语法 plot(Y) plot(X1,Y1,...) plot(X1,Y1,LineSpec,...) plot(...,'PropertyName',PropertyValue, ...

  8. UVA 11796 - Dog Distance

    题意  两条狗啊,同时跑,,同时结束,各自跑各自的道路,问跑的过程中,他们最大距离和最小距离的差: 方法  恶心一点就是,最大最小距离的求解方法,假设两只狗都只有一条线段要跑,则可以判定在端点处有最大 ...

  9. Android下Fragment的动画切换效果

    效果图如下: 源码链接   :    请戳这里

  10. 四:分布式事务一致性协议paxos通俗理解

    转载地址:http://www.lxway.com/4618606.htm 维基的简介:Paxos算法是莱斯利·兰伯特(Leslie Lamport,就是 LaTeX 中的"La" ...