用ES6語法寫的btnSelect下拉按鈕

btnSelect下拉按鈕

按鈕支持多個按鈕關(guān)聯(lián),帶聯(lián)想功能
// 下拉選擇按鈕 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="專業(yè)">
      <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>
 *
 * 簡寫 在實例化的時候會補全,不過這樣是沒有初始數(shù)據(jù)的
    <span class="btn__select">
      <input type="text" placeholder="專業(yè)">
      <input type="hidden" name="qwe">
    </span>
 * 
 * 導(dǎo)入數(shù)據(jù)
    window.btnSelectList.qwe.set({
      caa: "中國美術(shù)學(xué)院",
      tafa: "天津美術(shù)學(xué)院",
      xafa: "西安美術(shù)學(xué)院"
    })
 *
 * 獲取
    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"))
    })
    // 監(jiān)聽輸入動作偏塞,觸發(fā)搜索功能
    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關(guān)聯(lián)器
 * 在btnSelect初始化之后 才能 將關(guān)聯(lián)器調(diào)用初始化
 *
 * 在實例化關(guān)聯(lián)器是傳入與關(guān)聯(lián)按鈕的name數(shù)組吆你,按關(guān)聯(lián)順序排序
 * 如下:province的下一級是city
 * 
 * 關(guān)于初始化的板栗:
    var btnSelectRelations = new btnSelectRelation(["province","city"])
    btnSelectRelations.init()
 *
 * 設(shè)置數(shù)據(jù):
    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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市符喝,隨后出現(xiàn)的幾起案子谤祖,更是在濱河造成了極大的恐慌婿滓,老刑警劉巖,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件粥喜,死亡現(xiàn)場離奇詭異凸主,居然都是意外死亡,警方通過查閱死者的電腦和手機额湘,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進(jìn)店門跃洛,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蜡镶,“玉大人壹罚,你說我怎么就攤上這事恋日。” “怎么了毯焕?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵衍腥,是天一觀的道長。 經(jīng)常有香客問我纳猫,道長婆咸,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任芜辕,我火速辦了婚禮尚骄,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘侵续。我一直安慰自己倔丈,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布状蜗。 她就那樣靜靜地躺著乃沙,像睡著了一般。 火紅的嫁衣襯著肌膚如雪诗舰。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天训裆,我揣著相機與錄音眶根,去河邊找鬼蜀铲。 笑死,一個胖子當(dāng)著我的面吹牛属百,可吹牛的內(nèi)容都是我干的记劝。 我是一名探鬼主播,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼族扰,長吁一口氣:“原來是場噩夢啊……” “哼厌丑!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起渔呵,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤怒竿,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后扩氢,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體耕驰,經(jīng)...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年录豺,在試婚紗的時候發(fā)現(xiàn)自己被綠了朦肘。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,161評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡双饥,死狀恐怖媒抠,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情咏花,我是刑警寧澤趴生,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站迟螺,受9級特大地震影響冲秽,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜矩父,卻給世界環(huán)境...
    茶點故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一锉桑、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧窍株,春花似錦民轴、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至冒滩,卻和暖如春微驶,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工因苹, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留苟耻,地道東北人。 一個月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓扶檐,卻偏偏與公主長得像凶杖,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子款筑,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,916評論 2 344

推薦閱讀更多精彩內(nèi)容

  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫智蝠、插件、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,033評論 4 62
  • 《拖延心理學(xué)》作者是簡·博克奈梳、萊諾拉·袁杈湾。讀完整本書,我知道什么是拖延颈嚼?拖延的根源及其本質(zhì)是什么毛秘?有哪些方法應(yīng)對拖...
    ICE蟈蟈閱讀 487評論 0 2
  • 第六章 盧比肯號 維克崔克斯·索若拉上的混沌信徒顯然發(fā)現(xiàn)內(nèi)政部是一個絕佳的藏身之處,作為帝國最龐大最刻板的組織之一...
    Geo魏巍閱讀 871評論 0 4
  • 玥玥阻课,性別:女叫挟,今年7歲零3個月,讀一年級限煞,是個愛唱愛跳的小姑娘抹恳。她在幼兒園大班最后一學(xué)期接觸了一下英語,...
    Jane的心愿閱讀 231評論 0 1
  • 2016.12.24 Morning Dormitary 難道是沒有寫作素材了署驻?還是說你有心結(jié)奋献?...
    beyound20閱讀 129評論 4 0