中文字幕免费精品_亚洲视频自拍_亚洲综合国产激情另类一区_色综合咪咪久久

Bootstrap每天必學之級聯下拉菜單
來源:易賢網 閱讀:1611 次 日期:2016-07-15 16:21:17
溫馨提示:易賢網小編為您整理了“Bootstrap每天必學之級聯下拉菜單”,方便廣大網友查閱!

本文將介紹自定義的bootstrap級聯下拉菜單,主要應用場合有省市級關聯菜單等等,那么就先拿這個例子來講,當然其他場景的關聯菜單也同樣適用。說實話,封裝好一個通用的組件還是需要花費很多精力的和時間的,所謂通用,自然要考慮周全,嘆!這次整理的Bootstrap關聯select,里面也涉及到了很多jquery、ajax、springMVC等等知識點,可謂包羅萬象!

首先,請允許我代表該自定義組件做一番小小的介紹。

“hi,你好,我叫yunm.combox.js,主人給我起的名字,其實呢,挺俗的。我主要通過為select組件增加兩個自定義屬性來完成相應的數據加載,數據請求使用了ajax,后端數據處理使用了springMVC(當然其他方式也可以,只需要返回對應的json數據即可),使用起來呢,就非常非常簡單了!”

一、界面效果

名單

當然了,從界面上完全看不出來一個組件封裝的好壞,但至少,你感覺很簡潔漂亮,那么好了,有了這層印象,你是否有興趣繼續看下去?我想答案是肯定的。

二、使用方法

①、procity.jsp

首先呢,在頁面上加載yunm.combox.js(稍候介紹,至于其他的bootstrap的css和js,不在本章介紹范圍內,略過),同時呢,創建兩個select,具體格式見如下:

<script type="text/javascript" src="${ctx}/components/yunm/yunm.combox.js"></script>

<div class="form-group">

  <div class="row">

    <div class="col-md-6">

      <select name="province_code" class="form-control combox" ref="city_select"

        refUrl="${ctx}/procity?pro_code={value}&city_code=HSLY">

      </select>

    </div>

    <div class="col-md-6">

      <select name="city_code" id="city_select" class="form-control">

      </select>

    </div>

  </div>

</div>

<script type="text/javascript">

<!--

  $(function() {

    if ($.fn.combox) {

      $("select.combox", $p).combox();

    }

  });

//-->

</script>

·兩個select組件,一個為province_code、一個為city_code。

·省級菜單上增加了兩個屬性。 

ref指定關聯菜單為市級菜單city_select

refUrl指定菜單獲取數據的URL 

pro_code作為獲取市級數據的關鍵因子

{value}呢,則為通配符,稍候在介紹組件的時候繼續講到

city_code=HSLY,主要用于選中指定的省市菜單,諸如上文中的(河南、洛陽),如果不選中,則city_code=為空

·class=”combox” 為該省級下拉框增加jquery選擇器

·頁面加載完畢后執行combox組件的關鍵方法,下面詳細介紹

②、yunm.combox.js

現在我們來看看關鍵的組件內容吧!

(function($) {

  var _onchange = function(event) {

    var $ref = $("#" + event.data.ref);

    if ($ref.size() == 0)

      return false;

    var refUrl = event.data.refUrl;

    var value = encodeURIComponent(event.data.$this.val());

    YUNM.debug(value);

    $.ajax({

      type : 'POST',

      dataType : "json",

      url : refUrl.replace("{value}", value),

      cache : false,

      data : {},

      success : function(response) {

        $ref.empty();

        addHtml(response, $ref);

        $ref.trigger("change").combox();

      },

      error : YUNM.ajaxError

    });

  };

  var addHtml = function(response, $this) {

    var json = YUNM.jsonEval(response);

    if (!json)

      return;

    var html = '';

    $.each(json, function(i) {

      if (json[i]) {

        html += '<option value="' + json[i].value + '"';

        if (json[i].selected) {

          html += ' selected="' + json[i].selected;

        }

        html += '">' + json[i].name + '</option>';

      }

    });

    $this.html(html);

  };

  $.extend($.fn, {

    combox : function() {

      return this.each(function(i) {

        var $this = $(this);

        var value = $this.val() || '';

        var ref = $this.attr("ref");

        var refUrl = $this.attr("refUrl") || "";

        if (refUrl) {

          refUrl = refUrl.replace("{value}", encodeURIComponent(value));

        }

        if (refUrl) {

          $.ajax({

            type : 'POST',

            dataType : "json",

            url : refUrl,

            cache : false,

            data : {},

            success : function(response) {

              addHtml(response, $this);

              if (ref && $this.attr("refUrl")) {

                $this.unbind("change", _onchange).bind("change", {

                  ref : ref,

                  refUrl : $this.attr("refUrl"),

                  $this : $this,

                }, _onchange).trigger("change");

              }

            },

            error : YUNM.ajaxError

          });

        }

      });

    }

  });

})(jQuery);

·通過$.extend($.fn, { combox : function() {為jquery增加一個叫combox的底層(可以查詢jquery幫助文檔)方法。

·通過(function($){_onchange、addHtml})(jQuery);為該組件在頁面初始加載時創建兩個方法onchange和addHtml,至于(function($) {})(jQuery);我想你如果不了解的話,趕緊百度吧!

·先來看combox 方法 

獲取ref、refUrl,通過ajax向refUrl請求省級菜單數據,當獲取成功后,通過addHtml方法將json轉換后的option綁定到省級菜單select上

然后呢,為省級菜單select綁定change事件,傳遞的參數為ref(市級菜單)、refUrl(市級數據獲取的url)、$this(省級菜單,便于change事件獲取對應選中項,如效果圖中的河南)

通過trigger方法立即執行change事件,便于獲取對應的市級菜單內容。

·再來看_onchange方法,主要是點擊省級菜單時觸發,用于獲取市級菜單列表 

refUrl,向服務端請求的URL

value,用于獲取省級菜單的選中項目,然后通過該value值獲取省級對應的市級菜單

$ref.empty();用于清空市級菜單

通過ajax繼續獲取市級菜單內容,然后通過addHtml方法添加到市級菜單中。

·addHtml方法 

通過jsonEval方法對服務端傳遞回來的數據進行eval(eval('(' + data + ')'),如有不懂,可百度)方法處理,否則會出錯。

$.each(json, function(i) {遍歷json,通過jquery創建option對象,然后加入到select中。

③、ProcityController

前端介紹完了,我們回到后端進行介紹,當然了,你也可以忽略本節,因為不是所用的關聯數據都通過springMVC這種方法獲取,那么先預覽一下代碼吧!

package com.honzh.spring.controller;

import java.util.ArrayList;

import java.util.List;

import javax.servlet.http.HttpServletResponse;

import org.apache.log4j.Logger;

import org.springframework.stereotype.Controller;

import org.springframework.web.bind.annotation.RequestMapping;

import org.springframework.web.bind.annotation.RequestParam;

import com.honzh.biz.database.entity.City;

import com.honzh.biz.database.entity.Option;

import com.honzh.biz.database.entity.Provincial;

import com.honzh.common.util.JsonUtil;

import com.honzh.spring.service.CityService;

import com.honzh.spring.service.ProvincialService;

@Controller

@RequestMapping(value = "/procity")

public class ProcityController extends BaseController {

  private static Logger logger = Logger.getLogger(ProcityController.class);

  /**

   * 當傳遞city_code,則表明下拉框要被選中,否則不選中

   */

  @RequestMapping("")

  public void index(@RequestParam(value = "city_code", required = false) String city_code,

      @RequestParam(value = "pro_code", required = false) String pro_code, HttpServletResponse response) {

    try {

      logger.debug("獲取所在地區" + city_code + ", 省" + pro_code);

      // 如果pro_code為””,則表明要獲取城市菜單,否則獲取市級菜單

      if (!pro_code.equals("")) {

        Integer pro_id = ProvincialService.getInstance().getByProvincialcode(pro_code).getId();

        List<City> citys = CityService.getInstance().getCitysByProvincialId(pro_id);

        List<Option> coptions = new ArrayList<Option>(citys.size());

        for (City city : citys) {

          Option coption = new Option();

          coption.setId(city.getId());

          coption.setName(city.getCname());

          coption.setValue(city.getCode());

          // 市級菜單被選中

          if (city_code != null && !city_code.equals("")) {

            if (city.getCode().equals(city_code)) {

              coption.setSelected("selected");

            }

          }

          coptions.add(coption);

        }

        renderJson(response, coptions);

      } else {

        List<Provincial> provincials = ProvincialService.getInstance().getProvincials();

        // 轉換成標準的option屬性(name,value,selected)

        List<Option> options = new ArrayList<Option>(provincials.size());

        // 被選中的省市

        // 則說明是展示頁面,此時需要為省級菜單和市級菜單設置選擇項

        if (city_code != null && !city_code.equals("")) {

          Provincial selected_provincial = ProvincialService.getInstance().getProvincialByCitycode(city_code);

          pro_code = selected_provincial.getProcode();

        } else {

          pro_code = provincials.get(0) == null ? "" : provincials.get(0).getProcode();

        }

        for (Provincial provincial : provincials) {

          Option option = new Option();

          option.setId(provincial.getId());

          option.setName(provincial.getProname());

          option.setValue(provincial.getProcode());

          if (!pro_code.equals("") && provincial.getProcode().equals(pro_code)) {

            option.setSelected("selected");

          }

          options.add(option);

        }

        renderJson(response, JsonUtil.toJson(options));

      }

    } catch (Exception e) {

      logger.error(e.getMessage());

      logger.error(e.getMessage(), e);

      renderJson(response, null);

    }

  }

}

@RequestParam(value = "city_code", required = false) String city_code,對于RequestParam注解,其實非常好用,這里就不多做解釋,只是推廣一下,固定個數的參數,用該注解更易于代碼的維護。

ProvincialService類、CityService類就是兩個單例,盡量把數據放置在內存當中,減少查詢數據庫的次數,稍候貼出來一個例子。

Option類就是單純的封裝前端option組件的關鍵屬性,便于組件的通用化。

renderJson(response, JsonUtil.toJson(options));將數據json化后返回,稍候貼上詳細代碼。

④、ProvincialService.java

只貼出來代碼例子,不做詳細解釋,畢竟不是本章重點。

package com.honzh.spring.service;

import java.util.ArrayList;

import java.util.List;

import com.honzh.biz.database.entity.City;

import com.honzh.biz.database.entity.Provincial;

import com.honzh.biz.database.mapper.ProvincialMapper;

import com.honzh.common.spring.SpringContextHolder;

public class ProvincialService {

  private static Object lock = new Object();

  private static ProvincialService config = null;

  private ProvincialService() {

    provincials = new ArrayList<Provincial>();

    ProvincialMapper mapper = SpringContextHolder.getBean(ProvincialMapper.class);

    provincials.addAll(mapper.getProvincials());

  }

  public static ProvincialService getInstance() {

    synchronized (lock) {

      if (null == config) {

        config = new ProvincialService();

      }

    }

    return (config);

  }

  public Provincial getByProvincialcode(String provincial_code) {

    for (Provincial provincial : provincials) {

      if (provincial.getProcode().equals(provincial_code)) {

        return provincial;

      }

    }

    return null;

  }

  private List<Provincial> provincials = null;

  public List<Provincial> getProvincials() {

    return provincials;

  }

  public Provincial getProvincialByCitycode(String city_code) {

    City city = CityService.getInstance().getCityByCode(city_code);

    for (Provincial provincial : provincials) {

      if (provincial.getId().intValue() == city.getProid().intValue()) {

        return provincial;

      }

    }

    return null;

  }

  public Provincial getProvincialByCode(String province_code) {

    for (Provincial provincial : provincials) {

      if (provincial.getProcode().equals(province_code)) {

        return provincial;

      }

    }

    return null;

  }

}

⑤、renderJson方法

/**

 * 如果出錯的話,response直接返回404

 */

protected void renderJson(HttpServletResponse response, Object responseObject) {

  PrintWriter out = null;

  try {

    if (responseObject == null) {

      response.sendError(404);

      return;

    }

    // 將實體對象轉換為JSON Object轉換

    String responseStr = JsonUtil.toJson(responseObject);

    response.setCharacterEncoding("UTF-8");

    response.setContentType("application/json; charset=utf-8");

    out = response.getWriter();

    out.append(responseStr);

    logger.debug("返回是:" + responseStr);

  } catch (IOException e) {

    logger.error(e.getMessage());

    logger.error(e.getMessage(), e);

  } finally {

    if (out != null) {

      out.close();

    }

  }

}

以上就是本文的全部內容,希望對大家的學習有所幫助。

更多信息請查看網絡編程
易賢網手機網站地址:Bootstrap每天必學之級聯下拉菜單
由于各方面情況的不斷調整與變化,易賢網提供的所有考試信息和咨詢回復僅供參考,敬請考生以權威部門公布的正式信息和咨詢為準!

2026上岸·考公考編培訓報班

  • 報班類型
  • 姓名
  • 手機號
  • 驗證碼
關于我們 | 聯系我們 | 人才招聘 | 網站聲明 | 網站幫助 | 非正式的簡要咨詢 | 簡要咨詢須知 | 新媒體/短視頻平臺 | 手機站點 | 投訴建議
工業和信息化部備案號:滇ICP備2023014141號-1 云南省教育廳備案號:云教ICP備0901021 滇公網安備53010202001879號 人力資源服務許可證:(云)人服證字(2023)第0102001523號
云南網警備案專用圖標
聯系電話:0871-65099533/13759567129 獲取招聘考試信息及咨詢關注公眾號:hfpxwx
咨詢QQ:1093837350(9:00—18:00)版權所有:易賢網
云南網警報警專用圖標
中文字幕免费精品_亚洲视频自拍_亚洲综合国产激情另类一区_色综合咪咪久久
国产精品久久久久久福利一牛影视| 国产综合欧美| 欧美一区二区三区四区在线| 欧美日韩精品一二三区| 国产精品高清免费在线观看| 性欧美激情精品| 亚洲免费综合| 亚洲国产精品电影在线观看| 久久免费国产精品| 亚洲欧美日韩中文播放| 日韩五码在线| 亚洲国产合集| 亚洲三级影片| 国产精品v欧美精品v日本精品动漫 | 欧美日韩一区二区欧美激情| 久久国产免费| 久久久av水蜜桃| 午夜国产精品视频| 亚洲专区一区二区三区| 亚洲日本视频| 日韩视频在线免费| 亚洲欧美精品在线观看| 欧美一区激情| 久久久久成人精品免费播放动漫| 日韩视频永久免费| 校园春色国产精品| 久久久精品网| 久久婷婷综合激情| 欧美午夜欧美| 国语精品一区| 亚洲伊人一本大道中文字幕| 久久精品二区三区| 欧美福利专区| 亚洲精品乱码久久久久久蜜桃麻豆 | 国产精品久久久久毛片大屁完整版 | 亚洲精品乱码久久久久久日本蜜臀| 亚洲国产精品ⅴa在线观看 | 久久久午夜视频| 欧美日韩亚洲国产一区| 在线观看欧美亚洲| 久久欧美肥婆一二区| 国产精品永久免费观看| 亚洲综合欧美日韩| 国产精品色网| 久久久久久69| 亚洲人久久久| 欧美成人蜜桃| 午夜在线播放视频欧美| 亚洲成色777777女色窝| 国产日韩欧美在线| 欧美激情导航| 久久男女视频| 欧美一区二区三区免费视频| 1769国产精品| 精品二区视频| 国产精品系列在线| 欧美日韩精品国产| 欧美精品三级| 欧美日韩视频一区二区三区| 亚洲欧美日韩精品久久久久| 日韩视频免费| 国产精品美女久久久免费| 国产一区二区三区最好精华液| 亚洲人成亚洲人成在线观看图片| 亚洲黄色视屏| 中文久久精品| 欧美日韩日本网| 亚洲欧美视频一区| 欧美精品成人一区二区在线观看 | 欧美精品久久久久久久免费观看| 99精品国产福利在线观看免费| 国产精品久久久久9999高清| 美国十次成人| 亚洲免费在线观看| 欧美大秀在线观看| 免费成人网www| 亚洲精品孕妇| 亚洲观看高清完整版在线观看| 亚洲国产精品一区二区久| 一区二区三区视频在线播放| 亚洲小说区图片区| 蜜臀91精品一区二区三区| 欧美日韩亚洲一区二区三区在线观看 | 国产精品视频免费一区| 欧美午夜一区二区| 欧美激情精品久久久久| 欧美日韩另类综合| 韩国免费一区| 一区二区三区四区蜜桃| 亚洲女女女同性video| 开心色5月久久精品| 国产精品毛片在线看| 国产女主播一区二区| 国产精品欧美久久| 国产午夜一区二区三区| 国精品一区二区三区| 亚洲午夜一区| 欧美午夜精品伦理| 夜夜精品视频一区二区| 欧美精品免费看| 国产精品自拍三区| 国产精品99久久久久久www| 免费亚洲婷婷| 日韩视频一区二区三区在线播放免费观看| 欧美专区在线观看一区| 狠狠色丁香久久综合频道| 久久精品日产第一区二区三区 | 欧美日韩国产123| 一区二区不卡在线视频 午夜欧美不卡在 | 国内自拍视频一区二区三区 | 麻豆av一区二区三区| 好吊妞**欧美| 欧美成人午夜激情| 夜夜嗨av一区二区三区| 国产精品成人一区二区网站软件 | 久久av一区二区三区漫画| 国产视频综合在线| 久久久久久久一区二区三区| 在线国产精品一区| 欧美日韩午夜视频在线观看| 亚洲欧美成人一区二区在线电影| 国产一区在线免费观看| 欧美日韩1234| 久久亚洲一区二区| 亚洲欧美三级在线| 一本色道久久综合亚洲精品小说| 国产日韩欧美91| 欧美日韩在线观看视频| 久久一区二区三区av| 亚洲欧美日韩国产成人| 亚洲高清久久| 亚洲福利国产精品| 国产日本欧美一区二区三区在线| 美女图片一区二区| 久久蜜桃资源一区二区老牛| 久久精品欧美日韩精品| 欧美一区二区免费观在线| 午夜精品电影| 亚洲最新合集| 亚洲一区二区伦理| 亚洲无亚洲人成网站77777| 在线一区亚洲| 亚洲线精品一区二区三区八戒| 99在线精品视频在线观看| 亚洲精品视频在线观看免费| 最新日韩欧美| 亚洲一区二区精品视频| 欧美一级淫片播放口| 欧美ed2k| 国产精品入口| 影音先锋亚洲电影| 99视频超级精品| 亚洲综合色激情五月| 欧美一区国产在线| 欧美精品亚洲精品| 国产亚洲高清视频| 亚洲第一精品久久忘忧草社区| 1769国产精品| 99re热这里只有精品免费视频| 亚洲一区二区三区免费视频| 久久se精品一区二区| 欧美日韩成人在线播放| 国产一区二区三区四区| 亚洲欧美日韩国产成人| 欧美激情bt| 在线精品视频在线观看高清| 亚洲免费在线播放| 国产精品扒开腿做爽爽爽视频 | 亚洲精品一区二区三区福利| 久久久国产成人精品| 国产精品成人一区二区网站软件| 精品999在线观看| 久久久久久国产精品一区| 国产精品福利在线| 一区二区三区久久久| 欧美精品一区二区蜜臀亚洲| 国内偷自视频区视频综合| 欧美在线播放| 亚洲国产精品视频一区| 久久综合国产精品| 91久久久在线| 欧美日韩a区| 亚洲一区一卡| 国产一区二区在线观看免费| 久久成人国产| 亚洲二区在线| 国产精品久久激情| 久久精品最新地址| 99国产精品久久久久老师| 欧美日韩国产综合视频在线观看| 亚洲欧美制服中文字幕| 在线日韩欧美| 国产人久久人人人人爽| 欧美日韩精品一二三区| 欧美在线在线| 亚洲欧美视频在线观看视频| 亚洲国产日韩美| 黑人一区二区三区四区五区| 欧美精选午夜久久久乱码6080| 亚洲欧美中文日韩v在线观看|