纯js代码生成可搜索选择下拉列表的实例


Posted in Javascript onJanuary 11, 2018

1、因为动态的css楼主写不出来,因此需要引入layui中的css样式:<link rel="stylesheet" href="${ctxStatic}/layui/css/layui.css" rel="external nofollow" rel="external nofollow" >;

2、需要引入jquery-1.8.3.js版本的jquery

话不多说,代码实现如下:

var selectData={};//下拉列表总数据
/**
 * 下拉搜索,多选择等
 */
$.fn.selectDataFun=function (json) {
  selectData[$(this).attr("id")]={thisDom:null,initData:null,jsonData:null,htmlText:null,
    isShow:true,selectElements:true,overStat:true,checkedElementIds:''};
  thisSelectFun($(this)).thisDom=$(this);//设置索引为id,值为本身对象
  thisSelectFun($(this)).initData=json;//初始数据为json
/*  var isShow=true;//是否显示
  var selectElements;//选择的选项
  var overStat=true;//鼠标经过的状态
  var checkedElementIds='';//选中项的id*/
  //根据字段生成html代码
  setFieldTypeFun($(this));
  //请求后台数据
  getSelectDataFun($(this));
  //生成下拉列表
  thisSelectFun($(this)).htmlText = createSelectFun($(this));//htmlText为缓存的html代码
  //调用总方法
  callMethodFun($(this));
}
//根据对象id值获取对象数据
function thisSelectFun(thisD) {
  if(thisD.attr("id")==''){
    alert("id值为空");
    return null;
  }
  return selectData[thisD.attr("id")]
}
//根据对象字段生成html代码
function setFieldTypeFun(thisD){
  var thisId=thisD.attr("id");
  var fields = selectData[thisId].initData;//以id获取该对象的所有数据
  //生成html代码
  var title=fields.title;
  var inputId=fields.inputId;
  var selectHtml='<div class="layui-form-select">'+'<div class="layui-select-title">'+
      '<input type="hidden" id="'+inputId+'" name="'+inputId+'" />'+
    '<span>'+title+':</span>'+' '+'<input id="'+thisD.attr("id")+'Search" value="" hiddenValue="" class="form-control input-sm" type="text">'+
    '<i class="layui-edge"></i>'+'</div>'+'<dl class="layui-anim layui-anim-upbit" id="'+thisD.attr("id")+'dl" style=""></dl>'+
    '</div>';
  thisD.append(selectHtml);
}
//请求后台数据
function getSelectDataFun(thisD) {
  var fields = selectData[thisD.attr("id")].initData;//以id获取该对象的所有数据
  //判断数据ajaxUrl中是否含有url字段
  if(fields.ajaxUrl.hasOwnProperty('url')){
    //以请求路径为url请求后台数据,并赋值给jsonData
    thisSelectFun(thisD).jsonData=ajaxFunss(fields.ajaxUrl);
  }else {
    if($.isEmptyObject(thisSelectFun(thisD).jsonData)){
      thisSelectFun(thisD).jsonData={ code: 0, msg: "获取成功", count: 0,data:new Array()};
    }
  }
}
//请求后台数据
function ajaxFunss(json) {
  json['async']=false;
  json['dataType']='json';
  json['type']='post';
  var layerLoadIndex = layer.load(1); //换了种风格
  var resultData=$.ajax(json);//发送请求
  layer.close(layerLoadIndex);
  if(resultData.status==200){//请求后台数据成功
    return resultData.responseJSON;
  }else {
    return null;
  }
}
//生成下拉列表
function createSelectFun(thisD) {
  var json=thisSelectFun(thisD).jsonData;
  var html='';
  for(var n in json){
    html+='<dd lay-value="'+json[n].id+'" class="">'+json[n].name+'</dd>';
  }
  var id=thisD.attr("id")+'dl';
  $("#"+id).append(html);
  return html;
}
//调用总方法
function callMethodFun(thisD) {
  var iDom=thisD.find(".layui-edge").eq(0);//i元素,eq为等于的意思
  var divDom = thisD.find(".layui-form-select").eq(0);//下拉列表所在的div
  /* var isShow = thisSelectFun(thisD).isShow;//是否显示
  var selectElement = thisSelectFun(thisD).selectElements;//选中的选项
  var overStat = thisSelectFun(thisD).overStat;//鼠标经过和离开状态
  var checkedElementIds = thisSelectFun(thisD).checkedElementIds;//隐藏输入框的value值*/
  //小三角符号绑定点击方法
  iDom.click(function () {
    if(thisSelectFun(thisD).isShow){
      thisSelectFun(thisD).isShow=false;
      divDom.addClass("layui-form-selected");//显示下拉列表
    }else {
      thisSelectFun(thisD).isShow=true;
      divDom.attr("class","layui-form-select");//隐藏下拉列表
    }
  });
  //dl元素绑定点击方法
  var dlDom=thisD.find("dl").eq(0);
  var searchId = thisD.attr("id")+'Search';//搜索框id
  dlDom.on("click",'dd',function () {
    if(thisSelectFun(thisD).initData.selectType) {
      //多选
      if (thisSelectFun(thisD).selectElements) {
        thisSelectFun(thisD).selectElements = false;
        $(this).addClass("layui-this");//设置勾选状态
        var text = $("#" + searchId).val();//输入框的内容
        var selectText = $(this).text() + ",";//选择的选项
        var checkedId = $(this).attr("lay-value") + ",";//获取选项的id
        if (text.indexOf(selectText) != -1) {//判断输入框中的内容是否包含有所选的选项
          return;
        }
        thisSelectFun(thisD).checkedElementIds += checkedId;
        $("#" + searchId).val(text + selectText);
      } else {
        thisSelectFun(thisD).selectElements = true;
        $(this).attr("class", "");//清空勾选状态
        var val = $(this).text() + ",";//勾选的选项
        var checkedId = $(this).attr("lay-value") + ',';//获取选项的id
        var text = $("#" + searchId).val().replace(val, "");//清除勾选的选项
        $("#" + searchId).val(text);//设置
        thisSelectFun(thisD).checkedElementIds = thisSelectFun(thisD).checkedElementIds.replace(checkedId, "");//清除勾选的选项
      }
    }else {
      //单选
      //获取已经选中的选项,并清除
      var ddDom=thisD.find(".layui-this").eq(0);
      ddDom.attr("class","");//清除
      $(this).addClass("layui-this");//设置勾选状态
      var selectText = $(this).text();//选择的选项
      var checkedId = $(this).attr("lay-value");//获取选项的id
      thisSelectFun(thisD).checkedElementIds = checkedId;
      $("#" + searchId).val(selectText);
      divDom.attr("class","layui-form-select");//隐藏下拉列表
  }
    var hiddenId=selectData[thisD.attr("id")].initData.inputId;//隐藏输入框id
    $("#"+hiddenId).val(thisSelectFun(thisD).checkedElementIds.substring(0,thisSelectFun(thisD).checkedElementIds.length-1));
  })
  //鼠标经过时
  dlDom.mouseover(function () {
    thisSelectFun(thisD).overStat=false;
  });
  //鼠标离开时
  dlDom.mouseout(function () {
    thisSelectFun(thisD).overStat=true;
  });
  //鼠标松开时
  $("body").mouseup(function () {
    if(thisSelectFun(thisD).overStat==true){//并且overStat为true
      divDom.attr("class","layui-form-select");//隐藏下拉列表
    }
  });
  //搜索框键盘松开事件
  var searchDom = thisD.find("#"+searchId).eq(0);//搜索框对象
  searchDom.keyup(function () {
    searchFunssss(thisD,searchId,divDom,dlDom);
  });
}
//根据输入内容搜索出匹配的选项
function searchFunssss(thisD,searchId,divDom,dlDom) {
  var val=$("#"+searchId).val();//搜索框id
  if(val.length>0){
    var conText='';//符合条件的选项
    var searchStats=false;//是否搜索到
    var htmlText=thisSelectFun(thisD).htmlText;//缓存的html代码
    dlDom.children().each(function () {
      var thisText=$(this).text();
      var thisDom='<dd lay-value="'+$(this).attr("lay-value")+'" class="">'+thisText+'</dd>';
      if(val==thisText){
        conText+=thisDom;
        htmlText=htmlText.replace(thisDom,"");
        searchStats=true;
        var searchId = thisD.attr("id")+'Search';//搜索框id
        $("#"+searchId).val("");//清空搜索框
      }
    });
    htmlText=conText+htmlText;
    dlDom.children().remove();//删除其子节点
    dlDom.append(htmlText);
    if(searchStats){
      divDom.addClass("layui-form-selected");//显示下拉列表
    }
  }
}

以上js代码放在名称为selectFun.js的js文件中

调用如下:

<%@ page contentType="text/html;charset=UTF-8" %>
<%@ include file="/webpage/include/taglib.jsp"%>
<html>
<head>
  <title>test</title>
  <meta name="decorator" content="default"/>
  <link rel="stylesheet" href="${ctxStatic}/layui/css/layui.css" rel="external nofollow" rel="external nofollow" >
  <script src="${ctxStatic}/selectFun.js" charset="utf-8"></script>
  <script type="text/javascript">
   $(document).ready(function() {
      $("#busgateDiv").selectDataFun({
        ajaxUrl:{url:'${ctx}/goods/goods/getStat',where:{}},//请求后台数据的路径
        selectType:true,//true多选,false单选
        title:'商品状态',//字段中文名称
        inputId:'busgate'//实体类字段
      });
      $("#sortDiv").selectDataFun({
        ajaxUrl:{url:'${ctx}/goods/goods/getSortname',where:{}},
        selectType:true,
        title:'商品大类',
        inputId:'sort'
      });
    });
  </script>
</head>
<body class="gray-bg">
  <div class="row">
  <div class="col-sm-12">
  <form:form id="searchForm" modelAttribute="goods" action="${ctx}/goods/goods/dataListFun" method="post" class="form-inline">
   <div class="form-group">
     <span>商品名称:</span>
      <form:input path="name" htmlEscape="false" maxlength="80" class=" form-control input-sm"/>
     <span>商品代码:</span>
      <form:input path="code" htmlEscape="false" maxlength="80" class=" form-control input-sm"/>
     <span>商品条码:</span>
      <form:input path="code2" htmlEscape="false" maxlength="30" class=" form-control input-sm"/>
    </div>
   <br/><br/>
   <div class="form-group">
     <div class="layui-inline" id="sortDiv">
     </div>
     <div class="layui-inline" id="busgateDiv">
     </div
   </div>
  </form:form>
  <br/>
  </div>
  </div>
  
</body>
</html>

纯js代码生成可搜索选择下拉列表的实例

纯js代码生成可搜索选择下拉列表的实例

以上这篇纯js代码生成可搜索选择下拉列表的实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
学习javascript面向对象 理解javascript原型和原型链
Jan 04 Javascript
仅30行代码实现Javascript中的MVC
Feb 15 Javascript
javascript拖拽应用实例(二)
Mar 25 Javascript
Bootstrap3.0建站教程(一)之bootstrap表单元素排版
Jun 01 Javascript
angularjs 源码解析之scope
Aug 22 Javascript
jQuery中checkbox反复调用attr('checked', true/false)只有第一次生效的解决方法
Nov 16 Javascript
微信小程序使用image组件显示图片的方法【附源码下载】
Dec 08 Javascript
JS实现的合并多个数组去重算法示例
Apr 11 Javascript
解决Vue axios post请求,后台获取不到数据的问题方法
Aug 11 Javascript
vue中的watch监听数据变化及watch中各属性的详解
Sep 11 Javascript
Bootstrap4 gulp 配置详解
Jan 06 Javascript
javascript设计模式之装饰者模式
Jan 30 Javascript
web前端vue之vuex单独一文件使用方式实例详解
Jan 11 #Javascript
vue-cli webpack 引入jquery的方法
Jan 10 #jQuery
JS计算两个时间相差分钟数的方法示例
Jan 10 #Javascript
Vuex 入门教程
Jan 10 #Javascript
js实现上传并压缩图片效果
Jan 10 #Javascript
web前端vue之CSS过渡效果示例
Jan 10 #Javascript
Vue.js分页组件实现:diVuePagination的使用详解
Jan 10 #Javascript
You might like
第四节--构造函数和析构函数
2006/11/16 PHP
不错的PHP学习之php4与php5之间会穿梭一点点感悟
2007/05/03 PHP
PHP连接MySQL查询结果中文显示乱码解决方法
2013/10/25 PHP
Symfony2创建页面实例详解
2016/03/18 PHP
javascript 动态加载 css 方法总结
2009/07/11 Javascript
EasyUI中的tree用法介绍
2011/11/01 Javascript
Google Map V3 绑定气泡窗口(infowindow)Dom事件实现代码
2013/04/26 Javascript
js获取元素到文档区域document的(横向、纵向)坐标的两种方法
2013/05/17 Javascript
javascript验证上传文件的类型限制必须为某些格式
2013/11/14 Javascript
jquery中的on方法使用介绍
2013/12/29 Javascript
javascript获取web应用根目录的方法
2014/02/12 Javascript
javascript 密码框防止用户粘贴和复制的实现代码
2014/02/17 Javascript
js网页右下角提示框实例
2014/10/14 Javascript
Javascript之Math对象详解
2016/06/07 Javascript
js实现文字超出部分用省略号代替实例代码
2016/09/01 Javascript
微信小程序 增、删、改、查操作实例详解
2017/01/13 Javascript
利用ES6的Promise.all实现至少请求多长时间的实例
2017/08/28 Javascript
angularjs实现过滤并替换关键字小功能
2017/09/19 Javascript
JavaScript生成指定范围的时间列表
2018/03/19 Javascript
nodejs 简单实现动态html的方法
2018/05/12 NodeJs
微信小程序上传图片功能(附后端代码)
2020/06/19 Javascript
微信小程序实现树莓派(raspberry pi)小车控制
2020/02/12 Javascript
Python正则表达式匹配ip地址实例
2014/10/09 Python
Python回调函数用法实例详解
2015/07/02 Python
Python删除空文件和空文件夹的方法
2015/07/14 Python
python从入门到精通(DAY 2)
2015/12/20 Python
python编写Logistic逻辑回归
2020/12/30 Python
pandas 两列时间相减换算为秒的方法
2018/04/20 Python
对Python模块导入时全局变量__all__的作用详解
2019/01/11 Python
快速排序的四种python实现(推荐)
2019/04/03 Python
Python中Numpy ndarray的使用详解
2019/05/24 Python
Opencv图像处理:如何判断图片里某个颜色值占的比例
2020/06/03 Python
Lookfantastic澳大利亚官网:英国知名美妆购物网站
2021/01/07 全球购物
护理专业学生职业生涯规划范文
2014/03/11 职场文书
《有趣的发现》教学反思
2014/04/15 职场文书
党员示范岗材料
2014/12/19 职场文书