美文网首页
用ES6语法写的btnSelect下拉按钮

用ES6语法写的btnSelect下拉按钮

作者: leenty | 来源:发表于2016-10-13 00:41 被阅读590次

    btnSelect下拉按钮

    按钮支持多个按钮关联,带联想功能
    // 下拉选择按钮 btnSelect
    /* 暴露btnSelect类,假定全局存在jQuery */
    export default class btnSelect {
      constructor () {
        this.btnSelectClass = ".btn__select"
      }
      init () {
        var btnSelectList = {}
        $(this.btnSelectClass).each(function(){
          var name = $(this).children('input[type="hidden"]').attr("name");
          var btnSelect = new btnSelectClass($(this))
          btnSelectList[name] = btnSelect
          btnSelect.init()
        })
        window.btnSelectList = btnSelectList
        var btnSelectRelations = new btnSelectRelation(["province","city"])
        btnSelectRelations.init()
      }
    }
    
    /**
     * 注册的组件放在window.btnSelectList下 取input[type='hidden']的name值为键名
        <span class="btn__select">
          <input type="text" placeholder="专业">
          <input type="hidden" name="qwe">
          <button type="button"></button>
          <ul>
            <li name="caa">123</li>
            <li name="tafa">456</li>
            <li name="xafa">789</li>
          </ul>
        </span>
     *
     * 简写 在实例化的时候会补全,不过这样是没有初始数据的
        <span class="btn__select">
          <input type="text" placeholder="专业">
          <input type="hidden" name="qwe">
        </span>
     * 
     * 导入数据
        window.btnSelectList.qwe.set({
          caa: "中国美术学院",
          tafa: "天津美术学院",
          xafa: "西安美术学院"
        })
     *
     * 获取
        window.btnSelectList.qwe.get()
     *   
     */
    class btnSelectClass {
      constructor (element, data = null){
        this.btn__select = element
        this.data = data
        this.preText = ""
        this.name = undefined
        this.btnSelectRelation = null
        this.set = data => {
          this.data = data
          this.reBuildDom(data)
        }
        this.get = () => this.btn__select.children("input[type='hidden']").val()
      }
    
      init () {
        var _this = this
        this.data == null && this.buildBtnSelect()
        // 选择 取值
        this.btn__select.on("click","li",function(){
          _this.setValue($(this).attr("name"), $(this).text())
          typeof _this.btnSelectRelation === "function" && _this.btnSelectRelation(_this.name,$(this).attr("name"))
        })
        // 监听输入动作,触发搜索功能
        this.btn__select.children("input[type='text']").keyup(e => {
          var val = $(e.target).val()
          val !== this.preText && this.search(val)
        })
        this.setName()
      }
    
      setValue (name, value) {
        this.btn__select.children("input[type='text']").val(value)
        this.btn__select.children("input[type='hidden']").val(name)
      }
    
      setName () {
        this.name = this.btn__select.children('input[type="hidden"]').attr("name")
      }
    
      buildBtnSelect () {
        var ul = this.btn__select.children("ul")
        var button = this.btn__select.children("button")
        button.length == 0 && this.btn__select.children("input[type='hidden']").after('<button type="button"></button>')
        if(ul.length == 0){
          this.btn__select.append("<ul></ul>")
          this.data = {}
        }else{
          var data = {}
          var items = this.btn__select.find("li")
          items.each(function(){
            data[$(this).attr("name")] = $(this).text()
          })
          this.data = data
        }
      }
    
      reBuildDom (data) {
        var ul = this.btn__select.children("ul")
        ul.empty()
        var items = ""
        $.each(data, function (k,v) {
          items += `<li name="${k}">${v}</li>`
        })
        ul.append(items)
      }
    
      search (val) {
        this.preText = val
        var data = {}
        if(val != ""){
          $.each(this.data,(k, v) => {
            (v.indexOf(val) > -1) && (data[k] = v)
          })
          this.reBuildDom(data)
        }else{
          this.reBuildDom(this.data)
        }
      }
    }
    
    /*["province","city"]*/
    /**
     * btnSelect关联器
     * 在btnSelect初始化之后 才能 将关联器调用初始化
     *
     * 在实例化关联器是传入与关联按钮的name数组,按关联顺序排序
     * 如下:province的下一级是city
     * 
     * 关于初始化的板栗:
        var btnSelectRelations = new btnSelectRelation(["province","city"])
        btnSelectRelations.init()
     *
     * 设置数据:
        window.btnSelectList.province.setSource({
          zj: "浙江省",
          hn: "湖南省",
          sc: "四川省"
        })
    
        window.btnSelectList.city.setSource({
          zj: {
            hz:"杭州市",
            sx:"绍兴市",
            jh:"金华市"
          },
          hn: {
            cs:"长沙市",
            yy:"岳阳市",
            cd:"常德市"
          },
          sc: {
            cd:"成都市",
            my:"绵阳市",
            dy:"德阳市"
          }
        })
     * 
     */
    class btnSelectRelation {
      constructor (relationType) {
        this.relationType = relationType
        this.relationData = []
        this.set = (childName, data) => {
          var index = this.getChildIndex(childName)
          this.relationData[index] = data
          index == 0 && this.setChildData(index, data)
        }
      }
      init () {
        $.each(this.relationType,(k, v) => {
          window.btnSelectList[v].setSource = data => {
            var name = v
            this.set(name,data)
          }
          window.btnSelectList[v].btnSelectRelation = (btnName,key) => {
            var index = this.getChildIndex(btnName) + 1
            index > 0 && index < this.relationData.length && this.filter(index, key)
          }
        })
      }
    
      getChildIndex (childName) {
        return this.relationType.indexOf(childName)
      }
    
      filter (index, key) {
        this.setChildData(index, this.relationData[index][key])
      }
    
      setChildData (index, data) {
        window.btnSelectList[this.relationType[index]].set(data)
      }
    }
    

    补上css,这里是用stylus语法

    /* 清除按钮样式 */
    btn-clean()
      border none
      outline none
      box-shadow none
      background none
    
    /* 下拉按钮样式 */
    dropDown()
      padding 0
      border-left 6px solid transparent
      border-right 6px solid transparent
      border-top 10px solid mt-orange
    
    .btn__select
      btn-clean()
      border 1px solid #ccc
      border-radius 2px
      font-size 14px
      color gray-a7
      padding 0.5em 0.7em
      position relative
      input,
      button
        btn-clean()
        &:focus~ul
          display block
      button
        dropDown()
      ul
        position absolute
        top 100%
        left 0
        width 100%
        border-radius 0 0 2px 2px
        box-shadow 0 2px 2px rgba(0,0,0,.3)
        display none
        &:hover
          display block
      li
        padding 0.5em 0.3em
        border 1px solid #ccc
        &:not(:last-child)
          border-bottom none
        &:last-child
          border-radius 0 0 2px 2px
    
    

    相关文章

      网友评论

          本文标题:用ES6语法写的btnSelect下拉按钮

          本文链接:https://www.haomeiwen.com/subject/cyzljttx.html