<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12
        

      JS組件系列——使用HTML標簽的data屬性初始化JS組件

      前言:最近使用bootstrap組件的時候發現一個易用性問題,很多簡單的組件初始化都需要在JS里面寫很多的初始化代碼,比如一個簡單的select標簽,因為僅僅只是需要從后臺獲取數據填充到option里面,可是從后臺取數據就需要js的初始化,所以導致頁面初始化的時候js的初始化代碼里面出現很多重復的代碼,看著很鬧心。于是想起bootstrap table里面的data屬性來,如果能夠直接在html里面使用data-*這種方式來初始化簡單的組件,那該多爽。我們先來看看bootstrap table的文檔:

      可以看到bootstrap table里面幾乎所有的屬性、事件都可以用data-*這種方式來做,感覺還不錯。那博主就要開始研究了。data-*這東西是哪里來的呢?

      一、jquery data()初探

      網上查了一圈,終于找到data-*的出處了,原來是Jquery和html5里面的,好東西,真是好東西!我們先來看看jquery的API

      原始用法如下:

      作用其實很明顯,就是給元素加某些屬性和數據,或者取值。

      下面看看data()方法和html5 data-*屬性的結合使用

      哈哈,這個東西好,通過html5 的data-*設置的值,能夠用jquery 的data()方法取到。這里的規則如下:

      1)所有的data屬性必須以“data-”開頭,

      2)屬性用“-”隔開,

      3)jquery里面取屬性的時候去掉“data”和“-”即可。

      有了這個作為基礎,我們就知道如何在標簽里面設置屬性,然后在js里面取對應的屬性了。下面就結合上次封裝combobox的例子來說明下。

      二、jquery data()實現data-*初始化組件

      還記得之前JS組件系列——封裝自己的JS組件,你也可以這篇里面封裝了一個簡單的combobox,可以通過url去后臺取數據。那么下面我們仍然在這個組件的基礎上做手腳,實現直接在select標簽里面添加data-*屬性來初始化下拉框組件。

      1、js組件封裝代碼

      (function ($) {
          //1.定義jquery的擴展方法combobox
          $.fn.combobox = function (options, param) {
              if (typeof options == 'string') {
                  return $.fn.combobox.methods[options](this, param);
              }
              //2.將調用時候傳過來的參數和default參數合并
              options = $.extend({}, $.fn.combobox.defaults, options || {});
              //3.添加默認值
              var target = $(this);
              target.attr('valuefield', options.valueField);
              target.attr('textfield', options.textField);
              target.empty();
              var option = $('<option></option>');
              option.attr('value', '');
              option.text(options.placeholder);
              target.append(option);
              //4.判斷用戶傳過來的參數列表里面是否包含數據data數據集,如果包含,不用發ajax從后臺取,否則否送ajax從后臺取數據
              if (options.data) {
                  init(target, options.data);
              }
              else {
                  //var param = {};
                  options.onBeforeLoad.call(target, options.param);
                  if (!options.url) return;
                  if (typeof options.param == "string"){
                      options.param = JSON.parse(options.param);
                  }
                  $.getJSON(options.url, options.param, function (data) {
                      init(target, data);
                  });
              }
              function init(target, data) {
                  $.each(data, function (i, item) {
                      var option = $('<option></option>');
                      option.attr('value', item[options.valueField]);
                      option.text(item[options.textField]);
                      target.append(option);
                  });
                  options.onLoadSuccess.call(target);
              }
              target.unbind("change");
              target.on("change", function (e) {
                  if (options.onChange)
                      return options.onChange(target.val());
              });
          }
      
          //5.如果傳過來的是字符串,代表調用方法。
          $.fn.combobox.methods = {
              getValue: function (jq) {
                  return jq.val();
              },
              setValue: function (jq, param) {
                  jq.val(param);
              },
              load: function (jq, url) {
                  $.getJSON(url, function (data) {
                      jq.empty();
                      var option = $('<option></option>');
                      option.attr('value', '');
                      option.text('請選擇');
                      jq.append(option);
                      $.each(data, function (i, item) {
                          var option = $('<option></option>');
                          option.attr('value', item[jq.attr('valuefield')]);
                          option.text(item[jq.attr('textfield')]);
                          jq.append(option);
                      });
                  });
              }
          };
      
          //6.默認參數列表
          $.fn.combobox.defaults = {
              url: null,
              param: null,
              data: null,
              valueField: 'value',
              textField: 'text',
              placeholder: '請選擇',
              onBeforeLoad: function (param) { },
              onLoadSuccess: function () { },
              onChange: function (value) { }
          };
      
          //這一段是新加的,在頁面初始化完成之后調用初始化方法
          $(document).ready(function () {
              $('.combobox').each(function () {
                  var $combobox = $(this);
                  $.fn.combobox.call($combobox, $combobox.data());
              })
          });
          
      })(jQuery);

      大部分代碼和上次的沒啥區別,我們重點看看最下面這一段

        //這一段是新加的,在頁面初始化完成之后調用初始化方法
          $(document).ready(function () {
              $('.combobox').each(function () {
                  var $combobox = $(this);
                  $.fn.combobox.call($combobox, $combobox.data());
              })
          });

      很明顯,就是在頁面初始化完成之后通過樣式選擇器去初始化組件。使用了each,如果有多個.combobox樣式,依次去初始化每一個。通過 $.fn.combobox.call($combobox, $combobox.data()); 調用call方法去調用combobox的初始化,call方法里面兩個參數分別對應:

      1)當前初始化的jquery對象

      2)參數列表。這里通過$combobox.data()得到的就是所有html里面的data-*屬性。將所有的data-*屬性作為參數傳入combobox的初始化方法中。

      2、html里面通過data-*初始化

       <select id="Search_"
               name="Search_province"
               class="form-control combobox"
               data-url="/Home/GetProvince"
               data-param='{"type":"0"}'
               data-text-field="Name"
               data-value-field="Id">
      </
      select>

      指定data-*屬性。從上面我們知道這里初始化是通過樣式選擇器.combobox來初始化組件的,所以就要求,如果想要使用data-*做組件的初始化,必須要設置一個class="combobox"樣式,這樣后臺才取得到需要初始化的標簽。

      3、后臺C#方法

       public class HomeController : Controller
       {
              public List<string> lstProvince = new List<string>() { "北京市", "天津市", "重慶市", "上海市", "河北省", "山西省", "遼寧省", "吉林省", "黑龍江省", "江蘇省", "浙江省", "安徽省", "福建省", "江西省", "山東省", "河南省", "湖北省", "湖南省", "廣東省", "海南省", "四川省", "貴州省", "云南省", "陜西省", "甘肅省", "青海省", "臺灣省", "內蒙古自治區", "廣西壯族自治區", "西藏自治區", "寧夏回族自治區", "新疆維吾爾自治區", "香港特別行政區", "澳門特別行政區" };
      
              public JsonResult GetProvince(string type)
              {
                  var lstRes = new List<Province>();
                  for (var i = 0; i < 10; i++)
                  {
                      var oModel = new Province();
                      oModel.Id = i;
                      oModel.Name = lstProvince[i];
                      lstRes.Add(oModel);
                  }
                 return Json(lstRes, JsonRequestBehavior.AllowGet);
              }
      
          }
      
          public class Province
          {
              public int Id { get; set; }
      
              public string Name { get; set; }
          }

      測試代碼,沒什么好說的。

      4、調試效果

      得到效果

      這樣基本就完成通過data-*來初始化組件了。

      三、總結

      上面簡單演示了下jquery data()方法結合html5 data-*屬性的使用。基本上能達到博主的需求:不用多寫一行js代碼直接初始化標簽。使用的時候直接引用jquery.js和jquery.extension.js文件即可。但是我們知道既然是html5里面的特性,那么對瀏覽器就得有一定的要求了。當然,此用法功能比較初級,但是對于一些簡單組件的初始化夠用了。文中如果有理解不對的地方,歡迎指出,博主將不勝感激。如果本文能夠對你有絲毫幫助,麻煩抬起你的小手點個推薦,博主一定繼續努力,將更好的文章分享給大家。

       

      posted @ 2016-01-26 13:21  懶得安分  閱讀(17724)  評論(10)    收藏  舉報
      主站蜘蛛池模板: 久久精品一区二区东京热| 国产普通话对白刺激| 精品国产av无码一区二区三区| 亚洲日本韩国欧美云霸高清| 少妇人妻偷人精品免费| 亚洲a∨国产av综合av下载| 日韩精品一卡二卡在线观看| 日韩少妇人妻vs中文字幕| 亚洲狠狠爱一区二区三区| 亚洲成人av在线高清| 亚洲www永久成人网站| 国产99在线 | 免费| 亚洲精品一区二区麻豆| 亚洲欧美日本久久网站| 在线观看无码不卡av| 免费看一区无码无a片www| 无线日本视频精品| 色欲AV无码一区二区人妻| 国产中文三级全黄| 在线无码午夜福利高潮视频| 国产偷国产偷亚洲清高| 亚洲欧洲一区二区精品| 无码 人妻 在线 视频| 亚洲欧洲一区二区综合精品| 国内精品久久久久影院网站| 67194熟妇在线观看线路| 中文字幕日韩区二区三区| 国内精品久久久久影院不卡| 亚洲岛国av一区二区| 亚洲精品成人片在线播放| 国产福利在线观看免费第一福利| 免费看国产精品3a黄的视频| 狠狠躁夜夜躁人人爽天天古典| 99久久国产综合精品成人影院| 亚洲区小说区图片区qvod| 精品国产亚洲午夜精品a| 麻花传媒在线观看免费| 欧美中文字幕在线看| 日韩精品亚洲国产成人av| 黑人巨大精品欧美| 日韩av在线一卡二卡三卡|