ySearchSelect.js 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162
  1. /**
  2. * 此功能与LayUI表单提交按钮 lay-filter="submitBut" 监听冲突
  3. * 冲突内容为回车按键。类型改成type="button",可以躲过监听。
  4. * <button type="button" class="layui-btn" lay-submit lay-filter="submitBut">立即提交</button>
  5. * **/
  6. (function ($) {
  7. $.fn.extend({
  8. "ySearchSelect": function (options) {
  9. defaluts.searchName = this.selector;
  10. var opts = $.extend({}, defaluts, options); //使用jQuery.extend 覆盖插件默认参数
  11. return this.each(function () { //这里的this 就是 jQuery对象。这里return 为了支持链式调用
  12. init(opts);
  13. });
  14. }
  15. });
  16. //默认参数
  17. var defaluts = {
  18. searchName: '.ySearchSelect'
  19. };
  20. var SELECT_VALUE = null; //保存上下键选中的项目的值
  21. var SELECT_INDEX = -1; //保存上下键选中的项目的索引
  22. //初始化插件
  23. function init(o){
  24. $(document).click(function(){
  25. $(".ySearchSelect ul").hide();
  26. $(".ySearchSelect .input-text").hide();
  27. $(".ySearchSelect i.layui-edge").removeClass("select");
  28. });
  29. $(o.searchName+" .layui-input").click(function(event){
  30. //阻止document点击事件
  31. event.stopPropagation();
  32. $(".ySearchSelect ul").hide();
  33. $(".ySearchSelect .input-text").hide();
  34. $(".ySearchSelect i.layui-edge").removeClass("select");
  35. if($(this).siblings(".input-text").length <= 0){
  36. var str = '<div class="input-text">'+
  37. '<input type="text" name="" placeholder="输入关键字" class="layui-input">'+
  38. '<i class="iconfont icon-sousuo"></i>'+
  39. '</div>';
  40. $(o.searchName).append(str);
  41. }
  42. if($(this).siblings("ul").css("display") == "none"){
  43. $(this).siblings("i").addClass("select");
  44. $(this).siblings("ul").show();
  45. $(this).siblings(".input-text").show();
  46. SELECT_VALUE = null; //保存上下键选中的项目的值
  47. SELECT_INDEX = -1; //保存上下键选中的项目的索引
  48. }else{
  49. $(this).siblings("i").removeClass("select");
  50. $(this).siblings("ul").hide();
  51. $(this).siblings(".input-text").hide();
  52. }
  53. $(o.searchName+" .input-text input").focus();
  54. $(o.searchName+" .input-text").width($(o.searchName+" ul li").width()+20);
  55. //键盘监听事件
  56. $(o.searchName+" .input-text input").keyup(function(event){
  57. if(event.keyCode != 38 && event.keyCode != 40 && event.keyCode != 13){
  58. ySearchSelectMate($(this).val(),o.searchName);
  59. //默认搜索过程中第一个项目被选中
  60. SELECT_INDEX = 0;
  61. selectKeyUD(event, o.searchName);
  62. }
  63. });
  64. //选项点击事件
  65. $(this).siblings("ul").find("li").click(function(){
  66. $(this).parent().hide();
  67. $(this).parent().siblings(".input-text").hide();
  68. $(this).parent().siblings("i.layui-edge").removeClass("select");
  69. $(".layui-input").text($(this).text());
  70. $("#cs_country").val($(this).data("c"));
  71. });
  72. });
  73. //上下键监听事件
  74. $(o.searchName).keydown(function(event){
  75. selectKeyUD(event, o.searchName);
  76. if(event.keyCode == 13){
  77. $(o.searchName+" ul").hide();
  78. $(o.searchName+" .input-text").hide();
  79. $(o.searchName).find("i.layui-edge").removeClass("select");
  80. $(o.searchName).find(".layui-input").text(SELECT_VALUE);
  81. }
  82. });
  83. }
  84. //点击上下按钮的执行方法
  85. function selectKeyUD(event, name){
  86. var nums = $(name+" ul").find("li.on").length;
  87. if(event.keyCode == 38){
  88. if(SELECT_INDEX <= 0){
  89. SELECT_INDEX = 0;
  90. }else{
  91. SELECT_INDEX--;
  92. }
  93. }
  94. if(event.keyCode == 40){
  95. if(SELECT_INDEX >= nums-1){
  96. SELECT_INDEX = nums-1;
  97. }else{
  98. SELECT_INDEX++;
  99. }
  100. }
  101. SELECT_VALUE = $(name+" ul").find(".on").eq(SELECT_INDEX).text();
  102. $(name+" ul").children().removeClass("active");
  103. $(name+" ul").find(".on").eq(SELECT_INDEX).addClass("active");
  104. //上下键跳滚动条
  105. //滑轮的位置
  106. try{
  107. var selectTop = $(name+" ul").find(".on").eq(SELECT_INDEX).position().top;
  108. if(selectTop < 41 || selectTop >= 192-5){
  109. if(SELECT_INDEX-4 <= 0){
  110. $(name+" ul").scrollTop(0);
  111. }else{
  112. $(name+" ul").scrollTop((SELECT_INDEX-4)*36);
  113. }
  114. }
  115. }catch(e){
  116. //TODO handle the exception
  117. // console.log("输入的搜索条件不符合");
  118. }
  119. }
  120. //匹配搜索,不匹配则隐藏。
  121. function ySearchSelectMate(value,name){
  122. value = $.trim(value.toString()); // 去掉两头空格
  123. if(value == ''){ // 如果搜索框输入为空
  124. $(name+" ul li").attr("class","on");
  125. return false;
  126. }
  127. var nums = $(name+" ul li").length;
  128. $(name+" ul li").attr("class","hide");
  129. for (var i = 0; i < nums; i++) {
  130. var pinyin = $("body").val($(name+" ul").children().eq(i).text()).toPinyin().substr();
  131. if(pinyin.toLowerCase().indexOf(value.toLowerCase()) > -1){
  132. $(name+" ul").children().eq(i).attr("class","on");
  133. }
  134. }
  135. $(name+" ul li:contains('"+value+"')").attr("class","on");
  136. }
  137. })(window.jQuery);