天天看点

js城市选择器组件

  1. KISSY.add(function(S,Base,Template,Switchable,Data){ 
  2.     var $ = S.all, 
  3.         Evt = S.Event, 
  4.         IO = S.io; 
  5.     //首字符排序 
  6.     var  wordsList; 
  7.     var NewCitySelector = function(id,cfg){ 
  8.         this.init(id,cfg); 
  9.     }; 
  10.     function findCityByCityId(cityId){ 
  11.         return __findByProp(0,cityId); 
  12.     } 
  13.     function findCityByCityName(cityName){ 
  14.         return __findByProp(1,cityName); 
  15.     } 
  16.     function __findByProp(index,val){ 
  17.         for(var i in Data){ 
  18.             for(var j in Data[i]){ 
  19.                 if(val == Data[i][j][index]){ 
  20.                     return { 
  21.                         cityId:Data[i][j][0], 
  22.                         cityName:Data[i][j][1], 
  23.                         category:i 
  24.                     }; 
  25.                 } 
  26.             } 
  27.         } 
  28.     } 
  29.     /** 
  30.         判断元素在元素内部 
  31.       **/ 
  32.       function isIn(t,p){ 
  33.         var $t = $(t), 
  34.             $p = $(p); 
  35.         if($t[0] && $p[0] && $t[0] === $p[0]){ 
  36.             return true; 
  37.         } 
  38.         if($($t,$p)[0]){ 
  39.             return true; 
  40.         } 
  41.       } 
  42.     var CLS_PREFIX = "ks-newcityselector-"; 
  43.     var CONTAINER_TPL = "<div class='"+CLS_PREFIX+"container'>" + "</div>"; 
  44.     var INNER_CONTAINER_TPL = "`wordsList``citiesList`"; 
  45.     // var WORDS 
  46.     S.extend(NewCitySelector,Base,{ 
  47.         init:function(id,cfg){ 
  48.             var self = this; 
  49.             var defaultCfg = { 
  50.                 autoOpen:false, 
  51.                 cityId:330100, 
  52.                 css:{ 
  53.                     "position":"absolute", 
  54.                     "z-index":"9999" 
  55.                 }, 
  56.                 target:$(id), 
  57.                 tpl:INNER_CONTAINER_TPL, 
  58.                 slideWidth:672 
  59.             }; 
  60.             if(!id || !$(id)[0]){ 
  61.                 S.log("no container"); 
  62.                 return; 
  63.             } 
  64.             self.$el = $(id);  
  65.             self.cfg = S.mix(defaultCfg,cfg,undefined,undefined,true); 
  66.             self.render(); 
  67.         }, 
  68.         render:function(){ 
  69.             var self = this; 
  70.             self.$pop = $(CONTAINER_TPL).insertAfter(self.$el); 
  71.             self.$pop.css(self.cfg.css); 
  72.             wordsList = []; 
  73.             var citiesListHTML  = "<div class="+CLS_PREFIX+"citycontainer"+"><div class='scroll'>"; 
  74.             for(var i in Data){ 
  75.                 wordsList.push(i); 
  76.                 var citiesHTML =  self.getListHTML(Data[i],'city'); 
  77.                 citiesListHTML += "<div class="+CLS_PREFIX+"tab-content"+" tab="+i+">" + citiesHTML +"</div>" 
  78.             } 
  79.             citiesListHTML += "</div></div>" 
  80.             var wordsListHTML = self.getListHTML(wordsList,'words'); 
  81.             var tplData = { 
  82.                 wordsList : wordsListHTML, 
  83.                 citiesList : citiesListHTML 
  84.             }; 
  85.             self.$pop = self.$pop.html(Template("<div class='"+CLS_PREFIX+"inner'>" + self.cfg.tpl + "</div>").render(tplData)); 
  86.             self.$cityContainer = $("."+CLS_PREFIX+"citycontainer",self.$pop); 
  87.             self.$wordListContainer = $("."+CLS_PREFIX+"words",self.$pop); 
  88.             self.bindEvt(); 
  89.             self.autoOpen && self.show(); 
  90.             S.log(self) 
  91.         }, 
  92.         bindEvt:function(){ 
  93.             var self = this; 
  94.             var timeout; 
  95.             self.$el.on("click",function(){ 
  96.                 self.show(); 
  97.             }); 
  98.             $("li",$("." + CLS_PREFIX + "words",self.$pop)).on("click",function(e){ 
  99.                 e.preventDefault(); 
  100.                 var $li = $(e.currentTarget); 
  101.                 var stype = $li.attr("stype"); 
  102.                 self.switchTo(stype); 
  103.             }); 
  104.             //自动隐藏覆层 
  105.             self.$pop.on("mouseleave",function(e){ 
  106.                 e.stopPropagation(); 
  107.                 self.isOnPop = false; 
  108.                 clearTimeout(timeout); 
  109.                 timeout = setTimeout(function(){self.hide()},1000); 
  110.             }); 
  111.             self.$pop.on("mousemove",function(e){ 
  112.                 e.stopPropagation(); 
  113.                 self.isOnPop = 1; 
  114.             }); 
  115.             self.$el.on("mousemove",function(e){ 
  116.                 e.stopPropagation(); 
  117.                 self.isOnPop = 1; 
  118.             }); 
  119.             $("li",$("." + CLS_PREFIX + "city",self.$pop)).on("click",function(e){ 
  120.                 e.preventDefault(); 
  121.                 var $a = $("a",$(e.currentTarget)); 
  122.                 self.onSelect({cityName:$a.text(),cityId:$a.attr("cityId")}); 
  123.             }); 
  124.             $("body").on("click",function(e){ 
  125.                 if(!isIn($(e.target),self.$pop) && !isIn($(e.target),self.$el)){ 
  126.                     self.isOnPop = false; 
  127.                     self.hide(); 
  128.                     self.fire("blur"); 
  129.                 } 
  130.             }); 
  131.         }, 
  132.         switchTo:function(stype,cb){ 
  133.             var self = this, 
  134.                 index, 
  135.                 slideWidth = self.cfg.slideWidth; 
  136.             index = S.isNumber(stype) ? stype - 0 : self.indexOfArray(stype,wordsList); 
  137.             $(".scroll",self.$pop).animate({marginLeft:-index * slideWidth},0.5,"easeOut",cb) 
  138.             $("li",$("."+CLS_PREFIX+"words")).item(index-0).addClass("cur").siblings().removeClass("cur"); 
  139.             self.set("category",stype); 
  140.         }, 
  141.         /** 
  142.             TODO 设置city  
  143.         **/ 
  144.         setCity:function(city){ 
  145.             var self = this, 
  146.                 cityObj; 
  147.             if(city){ 
  148.                 if(city > 0){ 
  149.                     cityObj = findCityByCityId(city); 
  150.                 }else{ 
  151.                     cityObj = findCityByCityName(city); 
  152.                 } 
  153.                 if(cityObj){ 
  154.                     self.switchTo(cityObj.category); 
  155.                     self.set("currentCity",cityObj); 
  156.                     self.set("cityId",cityObj.cityId); 
  157.                     self.set("cityName",cityObj.cityName); 
  158.                     self.set("category",cityObj.category); 
  159.                     // var index = self.indexOfArray(cityObj.category,wordsList); 
  160.                     // alert(index) 
  161.                     // $("li",self.$cityContainer).item(index) 
  162.                     $(self.cfg.target).html(cityObj.cityName); 
  163.                 } 
  164.             } 
  165.         }, 
  166.         indexOfArray:function(el,ary){ 
  167.             for(var i in ary){ 
  168.                 if(el == ary[i]) return i || 0; 
  169.             } 
  170.         }, 
  171.         show:function(){ 
  172.             var self = this; 
  173.             self.$pop.fadeIn(0.3); 
  174.         }, 
  175.         hide:function(){ 
  176.             var self = this; 
  177.             !self.isOnPop && self.$pop.fadeOut(0.3); 
  178.         }, 
  179.         getListHTML:function(ary,cls){ 
  180.             if(!ary || !cls) return ""; 
  181.             var html = "<ul class=" + CLS_PREFIX + cls + ">"; 
  182.             for(var i in ary){ 
  183.                 if(S.isArray(ary[i])){ 
  184.                     html += '<li><a href="#" cityId='+ary[i][0]+' title='+ary[i][1]+' >' + ary[i][1] + '</a></li>'; 
  185.                 }else{ 
  186.                     if(ary[i] == "hot"){ 
  187.                         html += '<li stype="hot"><a href="#">热门</a></li>';   
  188.                     }else{ 
  189.                         html += '<li stype='+ ary[i] +'><a href="#">' + ary[i] + '</a></li>'; 
  190.                     } 
  191.                 } 
  192.             } 
  193.             return html + '</ul>'; 
  194.         }, 
  195.         onSelect:function(e){ 
  196.             var self = this; 
  197.             self.fire("select",e); 
  198.             self.isOnPop = false; 
  199.             self.hide(); 
  200.         } 
  201.     }); 
  202.     return NewCitySelector; 
  203. },{requires:['base','template','switchable','./data','./assets/index.css']});