(function($) { var methods = { init: function(options) { var $this = this; options = $.extend($.fn.searchUser.options, options); return this.each(function() { var $thisSearchUser = $(this); var userData = [].concat(options.userData); // 用户数组[{userId, userName}](解除引用传递) var adjustLeftComponent = options.adjustLeftComponent; // 对齐控件 var limitUser = options.limitUser; // 限制用户数量 var isChangeable = options.isChangeable; // 是否可以改变用户 var placeholder = options.placeholder; // 搜索控件提示文字 var deleteOneUserFunc = options.deleteOneUserFunc; //删除一个用户的回调函数 var addOneUserFunc = options.addOneUserFunc; //加入一个用户的回调函数 $thisSearchUser.data("userData", userData); $thisSearchUser.data("adjustLeftComponent", adjustLeftComponent); $thisSearchUser.data("limitUser", limitUser); $thisSearchUser.data("isChangeable", isChangeable); $thisSearchUser.data("placeholder", placeholder); $thisSearchUser.data("deleteOneUserFunc", deleteOneUserFunc); $thisSearchUser.data("addOneUserFunc", addOneUserFunc); //初始化外部预设的user $(".drUserSpanContainer").off("click"); $(".drUserSpanContainer").remove(); for(var i = 0; i < userData.length; i++){ $thisSearchUser.searchUser("addOneUserSpanView",userData[i]); } //初始化placeholder $thisSearchUser.searchUser("setChangeable",isChangeable); // 搜索用户 function searchUserKeyword(keyword) { if ($.trim(keyword) == "") { if ($thisSearchUser.searchUser("isUserSearchShown")) { $("#drSearchUserContainer").popover("hide"); } return; } keyword = encodeURIComponent(keyword); var jRequest = $.ajax({ type: "GET", contentType: "application/x-www-form-urlencoded", url: "/indexhome/indexsearch?type=2&searchtype=3&top=8&keyword=" + keyword, beforeSend: function() { $('#loadingBar').drloadingbar("startLoad"); var currentReq = $("#drSearchUserContainer").data("jRequest"); if (currentReq != null) { // 前面的请求还未完成 currentReq.abort(); } }, success: function(data) { $('#loadingBar').drloadingbar("stopLoad"); var userArray = data.content, userLength = userArray.length; if (userLength > 0) { if ($thisSearchUser.searchUser("isUserSearchShown")) { $("#drSearchUserContainer").popover("hide"); } $("#drSearchUserContainer").popover("show"); for (var i = 0; i < userLength; i++) { $element = $("
  • " + $.htmlspecialchars(userArray[i].userName) + "
  • "); if(i == 0){ // 默认选中第一个用户 $element.addClass("isActive"); } $element.appendTo($("#drUserInputPopoverSearch")); } $("#drUserInputPopoverSearch").off("mouseenter"); $("#drUserInputPopoverSearch").off("click"); // 鼠标移到上面高亮显示 $("#drUserInputPopoverSearch").on("mouseenter", ".drUserInputPopoverSearchList", function() { if(!$(this).hasClass("isActive")){ $(".drUserInputPopoverSearchList.isActive").each(function(){ $(this).removeClass("isActive"); }); $(this).addClass("isActive"); } }); // 鼠标单击选中 $("#drUserInputPopoverSearch").on("click", ".drUserInputPopoverSearchList.isActive", function(e) { var content = $(this).find("span strong").text(); var userId = $(this).find("span[data-userid]").attr("data-userid"); $thisSearchUser.searchUser("addOneUser",userId, content); $("#drSearchUser").focus(); }); } else { if ($thisSearchUser.searchUser("isUserSearchShown")) { $("#drSearchUserContainer").popover("hide"); } } }, error: function(data) { if (data.statusText == "abort") { return; } $('#loadingBar').drloadingbar("stopLoad"); } }); $("#drSearchUserContainer").data("jRequest", jRequest); } // 粘贴事件 $("#drSearchUser").on("paste", function(e) { var userData = $thisSearchUser.data("userData"); var limitUser = $thisSearchUser.data("limitUser"); if (userData.length >= limitUser) { // 提示只能输入多少个用户 $("#drUserInputErrorPopoverContent").text("只能添加 " + limitUser + " 个用户"); if (!$thisSearchUser.searchUser("isUserInputErrorShown")) { $("#drSearchUser").popover("show"); } e.preventDefault(); return; } if ($thisSearchUser.searchUser("isUserInputErrorShown")) { $("#drSearchUser").popover("hide"); } var pasteText = e.originalEvent.clipboardData.getData("text/plain"); pasteText = pasteText.replace(/\r\n/g, ""); pasteText = pasteText.replace(/\r/g, ""); pasteText = pasteText.replace(/\n/g, ""); document.execCommand("insertHTML", false, pasteText); searchUserKeyword($(this).text()); }); // 光标离开事件 $("#drSearchUser").on("blur", function(e) { //return; if ($thisSearchUser.searchUser("isUserInputErrorShown")) { $("#drSearchUser").popover("hide"); } if ($thisSearchUser.searchUser("isUserSearchShown")) { setTimeout(function() { // 延迟200毫秒触发,否则若点击在content cell内部则立马被hide掉,无法触发 $("#drSearchUserContainer").popover("hide"); }, 200); } }); // 键盘按键事件 $("#drSearchUser").on("keydown", function(e) { var userData = $thisSearchUser.data("userData"); var limitUser = $thisSearchUser.data("limitUser"); var isChangeable = $thisSearchUser.data("isChangeable"); var keyCode = e.keyCode; if(!isChangeable){ e.preventDefault(); return; } if (keyCode == 8 || keyCode == 46) { // BackSpace, Delete if ($thisSearchUser.searchUser("isUserInputErrorShown")) { $("#drSearchUser").popover("hide"); } if ($(this).text() == "" && userData.length > 0) { e.preventDefault(); $thisSearchUser.searchUser("deleteOneUser"); return; } } if (userData.length >= limitUser) { e.preventDefault(); $(this).text(""); if (!$thisSearchUser.searchUser("isUserInputErrorShown")) { $("#drSearchUser").popover("show"); // 提示只能输入多少个用户 $("#drUserInputErrorPopoverContent").text("只能添加 " + limitUser + " 个用户"); } return; } if ($thisSearchUser.searchUser("isUserInputErrorShown")) { $("#drSearchUser").popover("hide"); } if (keyCode == 13 || keyCode == 108) { // Enter键 e.preventDefault(); // 处理标签 if ($thisSearchUser.searchUser("isUserSearchShown")) { var content = $(".drUserInputPopoverSearchList.isActive span strong").text(); var userId = $(".drUserInputPopoverSearchList.isActive span[data-userid]").attr("data-userid"); $thisSearchUser.searchUser("addOneUser",userId, content); $("#drSearchUserContainer").popover("hide"); } } else if (keyCode == 40) { // 下方向键 if ($thisSearchUser.searchUser("isUserSearchShown")) { var $nextNode = $($(".drUserInputPopoverSearchList.isActive")[0].nextSibling); $(".drUserInputPopoverSearchList.isActive").removeClass("isActive"); if ($nextNode.length == 0) { // 指向第一个 $(".drUserInputPopoverSearchList").first().addClass("isActive"); } else { // 指向下一个 $nextNode.addClass("isActive"); } } } else if (keyCode == 38) { // 上方向键 if ($thisSearchUser.searchUser("isUserSearchShown")) { var $previousNode = $($(".drUserInputPopoverSearchList.isActive")[0].previousSibling); $(".drUserInputPopoverSearchList.isActive").removeClass("isActive"); if ($previousNode.length == 0) { // 指向最后一个 $(".drUserInputPopoverSearchList").last().addClass("isActive"); } else { // 指向上一个 $previousNode.addClass("isActive"); } } } else { var $this = $(this); setTimeout(function() { searchUserKeyword($this.text()); }, 100); } }); // 错误弹出框初始化 $("#drSearchUser").popover({ trigger: "manual", html: true, animation: false, placement: "top", content: '

    ' }); // 搜索弹出框初始化 $("#drSearchUserContainer").popover({ trigger: "manual", html: true, animation: false, placement: "bottom", content: "
    " }); // 搜索弹出框显示后调整位置 $("#drSearchUserContainer").on('shown.bs.popover', function(e) { if (e.target != $("#drSearchUserContainer")[0]) { return; } var topVal = parseInt($('#drSearchUserContainer+.popover').css('top').substr(0, $('#drSearchUserContainer+.popover').css('top').length - 2)), inText = $("#drSearchUser").text(); $('#drSearchUserContainer+.popover').css('top', (topVal - 15) + 'px'); // 重新计算left var left = 0; if (!adjustLeftComponent) { left = $("#drSearchUserContainer").offset().left; } else { var left1 = $("#drSearchUserContainer").offset().left; var left2 = adjustLeftComponent.offset().left; left = left1 - left2; } $('#drSearchUserContainer+.popover').css('left', (left - 20) + 'px'); $('#drSearchUserContainer+.popover .arrow').css('left', (20 + 14 * inText.length / 2) + 'px'); }); // 单击删除一个用户 $thisSearchUser.on("click", ".drUserSpanContainer", function(e) { var isChangeable = $thisSearchUser.data("isChangeable"); if(!isChangeable){ e.preventDefault(); return; } $thisSearchUser.searchUser("deleteOneUser",$(e.target).data("userid")); }); }); }, // init End getUserArray: function() { return this.data("userData"); }, resetData:function(userData,isChangeable,limitUser){ this.data("userData", userData); this.data("limitUser", limitUser); this.searchUser("setChangeable", isChangeable); $(".drUserSpanContainer").off("click"); $(".drUserSpanContainer").remove(); for(var i = 0; i < userData.length; i++){ this.searchUser("addOneUserSpanView", userData[i]); } }, setPlaceholder:function(text){ var userData = this.data("userData"); if(userData.length > 0){ $("#drSearchUser")[0].setAttribute("data-placeholder", ""); }else{ $("#drSearchUser")[0].setAttribute("data-placeholder", text); } }, setChangeable:function(isChangeable){ this.data("isChangeable",isChangeable); var placeholder = this.data("placeholder"); if(isChangeable){ $("#drSearchUser").css("visibility", "visible"); this.searchUser("setPlaceholder",placeholder); }else{ $("#drSearchUser").css("visibility", "hidden"); } }, // 错误输入框popover是否存在 isUserInputErrorShown:function(){ if($("#drSearchUser").data('bs.popover') != null){ return $("#drSearchUser").data('bs.popover').tip().hasClass('in'); }else{ return false; } }, // 用户popover是否存在 isUserSearchShown:function(){ if($("#drSearchUserContainer").data('bs.popover') != null){ return $("#drSearchUserContainer").data('bs.popover').tip().hasClass('in'); }else{ return false; } }, //删除一个用户 deleteOneUser:function(userId) { var userData = this.data("userData"); var placeholder = this.data("placeholder"); var deleteOneUserFunc = this.data("deleteOneUserFunc"); var limitUser = this.data("limitUser"); if (userData.length <= limitUser) { if (this.searchUser("isUserInputErrorShown")) { $("#drSearchUser").popover("hide"); } } if(userData.length == 0){ return; } var deleteUserData = {}; if(userId == null){ //删除最后一个 var $deleteElement = $($(".drUserSpanContainer")[userData.length - 1]); $deleteElement.off("click"); $deleteElement.remove(); deleteUserData = userData[userData.length-1]; userData.splice(userData.length-1, 1); this.searchUser("setPlaceholder",placeholder); }else{ var $deleteElement = $(".drUserSpanContainer[data-userid="+userId+"]"); $deleteElement.off("click"); $deleteElement.remove(); for(var i = 0; i < userData.length; i++){ if(userData[i].userId == userId){ deleteUserData = userData[i]; userData.splice(i, 1); break; } } this.searchUser("setPlaceholder",placeholder); } if(deleteOneUserFunc != null){ if(arguments.length <= 1){ deleteOneUserFunc(deleteUserData); } } }, //增加用户对应的view操作 addOneUserSpanView:function(userDataElement){ $element = $(""); $element.text(userDataElement.userName); $element.attr("data-userid", userDataElement.userId); $element.addClass("drUserSpanContainer"); $element.insertBefore($("#drSearchUserContainer")); }, // 增加用户 addOneUser:function(userId, userName) { var userData = this.data("userData"); var placeholder = this.data("placeholder"); var limitUser = this.data("limitUser"); var addOneUserFunc = this.data("addOneUserFunc"); if (userName == "") { return; } if (userData.length >= limitUser) { // 提示只能输入多少个用户 if (!this.searchUser("isUserInputErrorShown")) { $("#drSearchUser").popover("show"); $("#drUserInputErrorPopoverContent").text("只能添加 " + limitUser + " 个用户"); } return; } for(var i = 0; i < userData.length; i++){ if(userId == userData[i].userId){ //提示重复 if(!this.searchUser("isUserInputErrorShown")){ $("#drSearchUser").popover("show"); $("#drUserInputErrorPopoverContent").text("已经添加了该用户"); } return; } } var addUserData = {userId:userId, userName:userName}; userData.push(addUserData); this.searchUser("setPlaceholder",placeholder); // 添加一个标签 this.searchUser("addOneUserSpanView",addUserData); $("#drSearchUser").text(""); if(this.searchUser("isUserSearchShown")){ $("#drSearchUserContainer").popover("hide"); } if(addOneUserFunc != null){ if(arguments.length <= 2){ addOneUserFunc(addUserData); } } } }; $.fn.searchUser = function(method) { // Method calling logic if (methods[method]) { return methods[method].apply(this, Array.prototype.slice.call(arguments, 1)); } else if (typeof method === 'object' || !method) { return methods.init.apply(this, arguments); } else { $.error('Method ' + method + ' does not exist on jQuery.searchUser'); } }; $.fn.searchUser.options = {userData: [], limitUser: 1, isChangeable: false, placeholder: "搜索收件人"}; })(jQuery);