/* * YanSelect 选择插件 * Copyright 2011, 刘玉宏 * 2011-05-10 v1.0 编写 */ (function ($) { $.fn.YanSelect = function (options) { var defaults = { secrhindex: [0, 1, 2, 3, 4, 5],//搜索列 valueindex: 0,//值对应列 textindex: 1,//显示对应列 columns: [],//列头数据 isPage: false,//是否分页 pagelen: 10,//页长度 isMulSel: false,//是不是多选 iscanedit: false,//是否能编辑 dataobj: null,//数据源 width: "400px", height: "400px", placetip: "搜索关键字", isCanAdd:true, afterSelect: $.noop, eventadd: $.noop//选中事件 }; var sel = 0; var options = $.extend(defaults, options); var TableHelp = { jsontotable: function ($tab, tabjson, cols) { //构造Header var TabHeader = ""; for (var i = 0; i < cols.length; i++) { TabHeader = TabHeader + "" + cols[i].text + ""; } TabHeader = TabHeader + ""; $tab.append(TabHeader); //构造BODY var TabBody = ""; for (var i = 0; i < tabjson.length; i++) { TabBody = TabBody + TableHelp.addrow(tabjson[i]); } TabBody = TabBody + "没有找到匹配的数据"; return $tab.append(TabBody); }, addrow: function (rowdata) { cols = options.columns; var TabTr = ""; for (var m = 0; m < cols.length; m++) { var FieldName = cols[m].fieldname; var tdvalue = rowdata[FieldName];//默认为dataField对应值 //处理width属性 var width = ""; if (cols[m].hasOwnProperty('width')) { width = "width:" + cols[m]['width']; } //处理width属性 if (cols[m].hasOwnProperty('ftcustom')) { if ($.isFunction(cols[m].ftcustom)) { tdvalue = ""; tdvalue = cols[m].ftcustom(rowdata, i); } } if (cols[m].hasOwnProperty('type')) { if (cols[m]['type'] == 'date') { tdvalue = tdvalue.replace("T", " "); } } if (tdvalue == null) { tdvalue = ""; } TabTr = TabTr + "" + tdvalue + ""; } TabTr = TabTr + ""; return TabTr; }, page: function (tab) { //添加分页 var pagelen = Math.ceil($("tbody tr[yanissel='Y']", tab).length / options.pagelen); var pagestr = ""; tab.find("tfoot").remove().end().append(pagestr); //添加分页 //默认长度 $("tbody tr", tab).slice(options.pagelen).hide(); //绑定事件(页数) $("li", tab).click(function (e) { e.stopPropagation(); e.preventDefault(); var pageindex = 1; //当前页 if ($(this).hasClass("page")) { pageindex = $(this).text(); } //上一页 if ($(this).hasClass("previous")) { pageindex = $(".active", tab).text() - 1; } //下一页 if ($(this).hasClass("next")) { pageindex = $(".active", tab).text() * 1 + 1 } if (pageindex > 0 && pageindex <= pagelen) { TableHelp.gopage(tab, pageindex); $("li", tab).removeClass("disabled active"); $("li", tab).eq(pageindex).addClass("disabled active"); } }) }, gopage: function (tab, pageindex) { $("tbody tr", tab).slice(0, (pageindex - 1) * options.pagelen).each(function () { if ($(this).attr("yanissel") === 'Y') { $(this).hide(); } }); $("tbody tr", tab).slice((pageindex - 1) * options.pagelen, pageindex * options.pagelen).each(function () { if ($(this).attr("yanissel") === 'Y') { $(this).show(); } }) $("tbody tr", tab).slice(pageindex * options.pagelen).each(function () { if ($(this).attr("yanissel") === 'Y') { $(this).hide(); } }) }, extaddrow: function (rowdata) { $(".tabData").append(TableHelp.addrow(rowdata)); } }; this.each(function () { var txt = $(this); if (!txt.attr("isinit")) { //如果已经有值并且没有实际值 if (txt.val() && !txt.attr("realvalue")) { for (var i = 0; i < options.dataobj.length; i++) { if (options.dataobj[i].ID == txt.val()) { var FieldName = options.columns[options.textindex].fieldname; txt.val(options.dataobj[i][FieldName]).attr("realvalue") } } } txt.attr("autocomplete", "off").attr("isinit", "Y"); var $tab = $("
", { style: "width:" + options.width }).addClass("table table-striped table-bordered table-condensed table-hover"); TableHelp.jsontotable($tab, options.dataobj, options.columns); var tablediv = $("
", { "class": "YanTabDiv " }).append($tab.show()).hide() $("body").append(tablediv); if (!options.iscanedit) { txt.attr("onfocus", "this.blur()"); $("thead", $tab).prepend("
新增
"); //新增回调 if (options.isCanAdd) { $(".YanSelect_Add", $tab).click(function () { if ($.isFunction(options.eventadd)) { options.eventadd.call(this, $(".searinput", $tab).val(), $(".YanSelect_Add", $tab)); } }) } else { $(".YanSelect_Add", $tab).remove(); } } //选择值 $(".datatr").live("click", function (event) { event.stopPropagation(); event.preventDefault(); setvalue($(this)); }) //txt事件 var searchinput = $(".searinput", $tab); txt.click(function (e) { $(".YanTabDiv").hide().find(".searinput").val(""); var txtoffset = $(this).offset(); var txth = $(this).outerHeight(true); tablediv.css({ "top": txtoffset.top + txth, "left": txtoffset.left }).show(); //获取数据 getdata(txt); $(".searinput", tablediv).focus().trigger('keyup'); }) txt.add(searchinput).keyup(function (e) { if (e.keyCode == 13) {//enter e.preventDefault(); $("tbody tr", tablediv).each(function () { if ($(this).hasClass("success")) { setvalue($(this)); $("tbody tr", tablediv).removeClass("success") } }) } else if (e.keyCode == 37) {//left } else if (e.keyCode == 38) {//up if (sel > 0) { sel--; $("tbody tr", tablediv).removeClass("success").eq(sel).addClass("success"); } } else if (e.keyCode == 39) {//right } else if (e.keyCode == 40) {//down //计算向下键能移动的距离 var count = options.pagelen > $("tbody tr[yanissel='Y']", tablediv).length ? $("tbody tr[yanissel='Y']", tablediv).length : options.pagelen; if (sel < count) { $("tbody tr", tablediv).removeClass("success").eq(sel).addClass("success"); sel++; } } else { sel = 0; tablediv.show(); if (!options.iscanedit) { getdata(searchinput); } else { getdata(txt); } } }); if (options.isMulSel) { txt.blur(function () { var realvalue = ""; txt.val(txt.val().substr(0, txt.val().lastIndexOf(",") + 1)) var arr = txt.val().substr(0, txt.val().length - 1).split(','); for (var i = 0; i < arr.length; i++) { $("tbody tr", tablediv).each(function () { if ($(this).find('td').eq(options.textindex).text() == arr[i]) { realvalue = realvalue + $(this).find('td').eq(options.valueindex).text() + ","; } }); } txt.attr("realvalue", realvalue); }); } var getdata = function (domint, istext) { var text = domint.val(); if (text != "") { $("tbody tr", tablediv).each(function () { var trtext = ""; var tr = $(this); $.each(options.secrhindex, function (i, n) { if (tr.find('td').eq(n)) { trtext = trtext + $.trim(tr.find('td').eq(n).text()); } }); if (trtext.indexOf(text) >= 0) { tr.show().attr("yanissel", "Y"); } else { tr.hide().attr("yanissel", "N"); } }) } else { $("tbody tr", tablediv).attr("yanissel", "Y").show(); } //如果不分页,则设定高度 if (options.isPage) { TableHelp.page($tab); } else { tablediv.css({ "max-height": options.height, "overflow-y": "auto" }); } $("tbody tr", tablediv).removeClass("success"); if ($("tbody tr:visible", tablediv).length == 0) { $("tfoot", tablediv).show() } else { $("tfoot", tablediv).hide() } } var setvalue = function (jdom) { var text = $.trim(jdom.find('td').eq(options.textindex).text()); var value = $.trim(jdom.find('td').eq(options.valueindex).text()); if (options.isMulSel) { txt.val(txt.val().substr(0, txt.val().lastIndexOf(",") + 1) + text + ","); } else { txt.val(text).attr("realvalue", value); tablediv.hide(); } txt.trigger("blur").trigger("change").next('input:hidden').val(value).trigger("change"); //回调 if ($.isFunction(options.afterSelect)) { options.afterSelect.call(this, jdom); } } $("body").click(function (event) { var eventsrc = event.srcElement || event.target; if (eventsrc) { if (!tablediv[0].contains(eventsrc) && !txt[0].contains(eventsrc)) { tablediv.hide(); } sel = 0; } }); } }); return TableHelp; }; })(jQuery);