city_list.js 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518
  1. /* *
  2. * ---------------------------------------- *
  3. * 城市选择组件 v1.0
  4. * Author: VVG
  5. * QQ: 83816819
  6. * Mail: mysheller@163.com
  7. * http://www.cnblogs.com/NNUF/
  8. * ---------------------------------------- *
  9. * Date: 2012-07-10
  10. * ---------------------------------------- *
  11. * */
  12. /* *
  13. * 全局空间 Vcity
  14. * */
  15. var Vcity = {};
  16. /* *
  17. * 静态方法集
  18. * @name _m
  19. * */
  20. Vcity._m = {
  21. /* 选择元素 */
  22. $:function (arg, context) {
  23. var tagAll, n, eles = [], i, sub = arg.substring(1);
  24. context = context || document;
  25. if (typeof arg == 'string') {
  26. switch (arg.charAt(0)) {
  27. case '#':
  28. return document.getElementById(sub);
  29. break;
  30. case '.':
  31. if (context.getElementsByClassName) return context.getElementsByClassName(sub);
  32. tagAll = Vcity._m.$('*', context);
  33. n = tagAll.length;
  34. for (i = 0; i < n; i++) {
  35. if (tagAll[i].className.indexOf(sub) > -1) eles.push(tagAll[i]);
  36. }
  37. return eles;
  38. break;
  39. default:
  40. return context.getElementsByTagName(arg);
  41. break;
  42. }
  43. }
  44. },
  45. /* 绑定事件 */
  46. on:function (node, type, handler) {
  47. node.addEventListener ? node.addEventListener(type, handler, false) : node.attachEvent('on' + type, handler);
  48. },
  49. /* 获取事件 */
  50. getEvent:function(event){
  51. return event || window.event;
  52. },
  53. /* 获取事件目标 */
  54. getTarget:function(event){
  55. return event.target || event.srcElement;
  56. },
  57. /* 获取元素位置 */
  58. getPos:function (node) {
  59. var scrollx = document.documentElement.scrollLeft || document.body.scrollLeft,
  60. scrollt = document.documentElement.scrollTop || document.body.scrollTop;
  61. var pos = node.getBoundingClientRect();
  62. return {top:pos.top + scrollt, right:pos.right + scrollx, bottom:pos.bottom + scrollt, left:pos.left + scrollx }
  63. },
  64. /* 添加样式名 */
  65. addClass:function (c, node) {
  66. if(!node)return;
  67. node.className = Vcity._m.hasClass(c,node) ? node.className : node.className + ' ' + c ;
  68. },
  69. /* 移除样式名 */
  70. removeClass:function (c, node) {
  71. var reg = new RegExp("(^|\\s+)" + c + "(\\s+|$)", "g");
  72. if(!Vcity._m.hasClass(c,node))return;
  73. node.className = reg.test(node.className) ? node.className.replace(reg, '') : node.className;
  74. },
  75. /* 是否含有CLASS */
  76. hasClass:function (c, node) {
  77. if(!node || !node.className)return false;
  78. return node.className.indexOf(c)>-1;
  79. },
  80. /* 阻止冒泡 */
  81. stopPropagation:function (event) {
  82. event = event || window.event;
  83. event.stopPropagation ? event.stopPropagation() : event.cancelBubble = true;
  84. },
  85. /* 去除两端空格 */
  86. trim:function (str) {
  87. return str.replace(/^\s+|\s+$/g,'');
  88. }
  89. };
  90. /* 所有城市数据,可以按照格式自行添加(北京|beijing|bj),前16条为热门城市 */
  91. Vcity.allCity = ['北京|beijing|bj','上海|shanghai|sh', '重庆|chongqing|cq', '深圳|shenzhen|sz', '广州|guangzhou|gz', '杭州|hangzhou|hz',
  92. '南京|nanjing|nj', '苏州|shuzhou|sz', '天津|tianjin|tj', '成都|chengdu|cd', '南昌|nanchang|nc', '三亚|sanya|sy','青岛|qingdao|qd',
  93. '厦门|xiamen|xm', '西安|xian|xa','长沙|changsha|cs','合肥|hefei|hf','西藏|xizang|xz', '内蒙古|neimenggu|nmg', '安庆|anqing|aq', '阿泰勒|ataile|atl', '安康|ankang|ak',
  94. '阿克苏|akesu|aks', '包头|baotou|bt', '北海|beihai|bh', '百色|baise|bs','保山|baoshan|bs', '长治|changzhi|cz', '长春|changchun|cc', '常州|changzhou|cz', '昌都|changdu|cd',
  95. '朝阳|chaoyang|cy', '常德|changde|cd', '长白山|changbaishan|cbs', '赤峰|chifeng|cf', '大同|datong|dt', '大连|dalian|dl', '达县|daxian|dx', '东营|dongying|dy', '大庆|daqing|dq', '丹东|dandong|dd',
  96. '大理|dali|dl', '敦煌|dunhuang|dh', '鄂尔多斯|eerduosi|eeds', '恩施|enshi|es', '福州|fuzhou|fz', '阜阳|fuyang|fy', '贵阳|guiyang|gy',
  97. '桂林|guilin|gl', '广元|guangyuan|gy', '格尔木|geermu|gem', '呼和浩特|huhehaote|hhht', '哈密|hami|hm',
  98. '黑河|heihe|hh', '海拉尔|hailaer|hle', '哈尔滨|haerbin|heb', '海口|haikou|hk', '黄山|huangshan|hs', '邯郸|handan|hd',
  99. '汉中|hanzhong|hz', '和田|hetian|ht', '晋江|jinjiang|jj', '锦州|jinzhou|jz', '景德镇|jingdezhen|jdz',
  100. '嘉峪关|jiayuguan|jyg', '井冈山|jinggangshan|jgs', '济宁|jining|jn', '九江|jiujiang|jj', '佳木斯|jiamusi|jms', '济南|jinan|jn',
  101. '喀什|kashi|ks', '昆明|kunming|km', '康定|kangding|kd', '克拉玛依|kelamayi|klmy', '库尔勒|kuerle|kel', '库车|kuche|kc', '兰州|lanzhou|lz',
  102. '洛阳|luoyang|ly', '丽江|lijiang|lj', '林芝|linzhi|lz', '柳州|liuzhou|lz', '泸州|luzhou|lz', '连云港|lianyungang|lyg', '黎平|liping|lp',
  103. '连成|liancheng|lc', '拉萨|lasa|ls', '临沧|lincang|lc', '临沂|linyi|ly', '芒市|mangshi|ms', '牡丹江|mudanjiang|mdj', '满洲里|manzhouli|mzl', '绵阳|mianyang|my',
  104. '梅县|meixian|mx', '漠河|mohe|mh', '南充|nanchong|nc', '南宁|nanning|nn', '南阳|nanyang|ny', '南通|nantong|nt', '那拉提|nalati|nlt',
  105. '宁波|ningbo|nb', '攀枝花|panzhihua|pzh', '衢州|quzhou|qz', '秦皇岛|qinhuangdao|qhd', '庆阳|qingyang|qy', '齐齐哈尔|qiqihaer|qqhe',
  106. '石家庄|shijiazhuang|sjz', '沈阳|shenyang|sy', '思茅|simao|sm', '铜仁|tongren|tr', '塔城|tacheng|tc', '腾冲|tengchong|tc', '台州|taizhou|tz',
  107. '通辽|tongliao|tl', '太原|taiyuan|ty', '威海|weihai|wh', '梧州|wuzhou|wz', '文山|wenshan|ws', '无锡|wuxi|wx', '潍坊|weifang|wf', '武夷山|wuyishan|wys', '乌兰浩特|wulanhaote|wlht',
  108. '温州|wenzhou|wz', '乌鲁木齐|wulumuqi|wlmq', '万州|wanzhou|wz', '乌海|wuhai|wh', '兴义|xingyi|xy', '西昌|xichang|xc', '襄樊|xiangfan|xf',
  109. '西宁|xining|xn', '锡林浩特|xilinhaote|xlht', '西双版纳|xishuangbanna|xsbn', '徐州|xuzhou|xz', '义乌|yiwu|yw', '永州|yongzhou|yz', '榆林|yulin|yl', '延安|yanan|ya', '运城|yuncheng|yc',
  110. '烟台|yantai|yt', '银川|yinchuan|yc', '宜昌|yichang|yc', '宜宾|yibin|yb', '盐城|yancheng|yc', '延吉|yanji|yj', '玉树|yushu|ys', '伊宁|yining|yn', '珠海|zhuhai|zh', '昭通|zhaotong|zt',
  111. '张家界|zhangjiajie|zjj', '舟山|zhoushan|zs', '郑州|zhengzhou|zz', '中卫|zhongwei|zw', '芷江|zhijiang|zj', '湛江|zhanjiang|zj'];
  112. /* 正则表达式 筛选中文城市名、拼音、首字母 */
  113. Vcity.regEx = /^([\u4E00-\u9FA5\uf900-\ufa2d]+)\|(\w+)\|(\w)\w*$/i;
  114. Vcity.regExChiese = /([\u4E00-\u9FA5\uf900-\ufa2d]+)/;
  115. /* *
  116. * 格式化城市数组为对象oCity,按照a-h,i-p,q-z,hot热门城市分组:
  117. * {HOT:{hot:[]},ABCDEFGH:{a:[1,2,3],b:[1,2,3]},IJKLMNOP:{i:[1.2.3],j:[1,2,3]},QRSTUVWXYZ:{}}
  118. * */
  119. (function () {
  120. var citys = Vcity.allCity, match, letter,
  121. regEx = Vcity.regEx,
  122. reg2 = /^[a-h]$/i, reg3 = /^[i-p]$/i, reg4 = /^[q-z]$/i;
  123. if (!Vcity.oCity) {
  124. Vcity.oCity = {hot:{},ABCDEFGH:{}, IJKLMNOP:{}, QRSTUVWXYZ:{}};
  125. //console.log(citys.length);
  126. for (var i = 0, n = citys.length; i < n; i++) {
  127. match = regEx.exec(citys[i]);
  128. letter = match[3].toUpperCase();
  129. if (reg2.test(letter)) {
  130. if (!Vcity.oCity.ABCDEFGH[letter]) Vcity.oCity.ABCDEFGH[letter] = [];
  131. Vcity.oCity.ABCDEFGH[letter].push(match[1]);
  132. } else if (reg3.test(letter)) {
  133. if (!Vcity.oCity.IJKLMNOP[letter]) Vcity.oCity.IJKLMNOP[letter] = [];
  134. Vcity.oCity.IJKLMNOP[letter].push(match[1]);
  135. } else if (reg4.test(letter)) {
  136. if (!Vcity.oCity.QRSTUVWXYZ[letter]) Vcity.oCity.QRSTUVWXYZ[letter] = [];
  137. Vcity.oCity.QRSTUVWXYZ[letter].push(match[1]);
  138. }
  139. /* 热门城市 前16条 */
  140. if(i<16){
  141. if(!Vcity.oCity.hot['hot']) Vcity.oCity.hot['hot'] = [];
  142. Vcity.oCity.hot['hot'].push(match[1]);
  143. }
  144. }
  145. }
  146. })();
  147. /* 城市HTML模板 */
  148. Vcity._template = [
  149. '<p class="tip">热门城市(支持汉字/拼音)</p>',
  150. '<ul>',
  151. '<li class="on">热门城市</li>',
  152. '<li>ABCDEFGH</li>',
  153. '<li>IJKLMNOP</li>',
  154. '<li>QRSTUVWXYZ</li>',
  155. '</ul>'
  156. ];
  157. /* *
  158. * 城市控件构造函数
  159. * @CitySelector
  160. * */
  161. Vcity.CitySelector = function () {
  162. this.initialize.apply(this, arguments);
  163. };
  164. Vcity.CitySelector.prototype = {
  165. constructor:Vcity.CitySelector,
  166. /* 初始化 */
  167. initialize :function (options) {
  168. var input = options.input;
  169. this.input = Vcity._m.$('#'+ input);
  170. this.inputEvent();
  171. },
  172. /* *
  173. * @createWarp
  174. * 创建城市BOX HTML 框架
  175. * */
  176. createWarp:function(){
  177. var inputPos = Vcity._m.getPos(this.input);
  178. var div = this.rootDiv = document.createElement('div');
  179. var that = this;
  180. // 设置DIV阻止冒泡
  181. Vcity._m.on(this.rootDiv,'click',function(event){
  182. Vcity._m.stopPropagation(event);
  183. });
  184. // 设置点击文档隐藏弹出的城市选择框
  185. Vcity._m.on(document, 'click', function (event) {
  186. event = Vcity._m.getEvent(event);
  187. var target = Vcity._m.getTarget(event);
  188. if(target == that.input) return false;
  189. //console.log(target.className);
  190. if (that.cityBox)Vcity._m.addClass('hide', that.cityBox);
  191. if (that.ul)Vcity._m.addClass('hide', that.ul);
  192. if(that.myIframe)Vcity._m.addClass('hide',that.myIframe);
  193. });
  194. div.className = 'citySelector';
  195. div.style.position = 'absolute';
  196. div.style.left = inputPos.left + 'px';
  197. div.style.top = inputPos.bottom + 'px';
  198. div.style.zIndex = 999999;
  199. // 判断是否IE6,如果是IE6需要添加iframe才能遮住SELECT框
  200. var isIe = (document.all) ? true : false;
  201. var isIE6 = this.isIE6 = isIe && !window.XMLHttpRequest;
  202. if(isIE6){
  203. var myIframe = this.myIframe = document.createElement('iframe');
  204. myIframe.frameborder = '0';
  205. myIframe.src = 'about:blank';
  206. myIframe.style.position = 'absolute';
  207. myIframe.style.zIndex = '-1';
  208. this.rootDiv.appendChild(this.myIframe);
  209. }
  210. var childdiv = this.cityBox = document.createElement('div');
  211. childdiv.className = 'cityBox';
  212. childdiv.id = 'cityBox';
  213. childdiv.innerHTML = Vcity._template.join('');
  214. var hotCity = this.hotCity = document.createElement('div');
  215. hotCity.className = 'hotCity';
  216. childdiv.appendChild(hotCity);
  217. div.appendChild(childdiv);
  218. this.createHotCity();
  219. },
  220. /* *
  221. * @createHotCity
  222. * TAB下面DIV:hot,a-h,i-p,q-z 分类HTML生成,DOM操作
  223. * {HOT:{hot:[]},ABCDEFGH:{a:[1,2,3],b:[1,2,3]},IJKLMNOP:{},QRSTUVWXYZ:{}}
  224. **/
  225. createHotCity:function(){
  226. var odiv,odl,odt,odd,odda=[],str,key,ckey,sortKey,regEx = Vcity.regEx,
  227. oCity = Vcity.oCity;
  228. for(key in oCity){
  229. odiv = this[key] = document.createElement('div');
  230. // 先设置全部隐藏hide
  231. odiv.className = key + ' ' + 'cityTab hide';
  232. sortKey=[];
  233. for(ckey in oCity[key]){
  234. sortKey.push(ckey);
  235. // ckey按照ABCDEDG顺序排序
  236. sortKey.sort();
  237. }
  238. for(var j=0,k = sortKey.length;j<k;j++){
  239. odl = document.createElement('dl');
  240. odt = document.createElement('dt');
  241. odd = document.createElement('dd');
  242. odt.innerHTML = sortKey[j] == 'hot'?'&nbsp;':sortKey[j];
  243. odda = [];
  244. for(var i=0,n=oCity[key][sortKey[j]].length;i<n;i++){
  245. str = '<a href="#">' + oCity[key][sortKey[j]][i] + '</a>';
  246. odda.push(str);
  247. }
  248. odd.innerHTML = odda.join('');
  249. odl.appendChild(odt);
  250. odl.appendChild(odd);
  251. odiv.appendChild(odl);
  252. }
  253. // 移除热门城市的隐藏CSS
  254. Vcity._m.removeClass('hide',this.hot);
  255. this.hotCity.appendChild(odiv);
  256. }
  257. document.body.appendChild(this.rootDiv);
  258. /* IE6 */
  259. this.changeIframe();
  260. this.tabChange();
  261. this.linkEvent();
  262. },
  263. /* *
  264. * tab按字母顺序切换
  265. * @ tabChange
  266. * */
  267. tabChange:function(){
  268. var lis = Vcity._m.$('li',this.cityBox);
  269. var divs = Vcity._m.$('div',this.hotCity);
  270. var that = this;
  271. for(var i=0,n=lis.length;i<n;i++){
  272. lis[i].index = i;
  273. lis[i].onclick = function(){
  274. for(var j=0;j<n;j++){
  275. Vcity._m.removeClass('on',lis[j]);
  276. Vcity._m.addClass('hide',divs[j]);
  277. }
  278. Vcity._m.addClass('on',this);
  279. Vcity._m.removeClass('hide',divs[this.index]);
  280. /* IE6 改变TAB的时候 改变Iframe 大小*/
  281. that.changeIframe();
  282. };
  283. }
  284. },
  285. /* *
  286. * 城市LINK事件
  287. * @linkEvent
  288. * */
  289. linkEvent:function(){
  290. var links = Vcity._m.$('a',this.hotCity);
  291. var that = this;
  292. for(var i=0,n=links.length;i<n;i++){
  293. links[i].onclick = function(){
  294. that.input.value = this.innerHTML;
  295. Vcity._m.addClass('hide',that.cityBox);
  296. /* 点击城市名的时候隐藏myIframe */
  297. Vcity._m.addClass('hide',that.myIframe);
  298. }
  299. }
  300. },
  301. /* *
  302. * INPUT城市输入框事件
  303. * @inputEvent
  304. * */
  305. inputEvent:function(){
  306. var that = this;
  307. Vcity._m.on(this.input,'click',function(event){
  308. event = event || window.event;
  309. if(!that.cityBox){
  310. that.createWarp();
  311. }else if(!!that.cityBox && Vcity._m.hasClass('hide',that.cityBox)){
  312. // slideul 不存在或者 slideul存在但是是隐藏的时候 两者不能共存
  313. if(!that.ul || (that.ul && Vcity._m.hasClass('hide',that.ul))){
  314. Vcity._m.removeClass('hide',that.cityBox);
  315. /* IE6 移除iframe 的hide 样式 */
  316. //alert('click');
  317. Vcity._m.removeClass('hide',that.myIframe);
  318. that.changeIframe();
  319. }
  320. }
  321. });
  322. Vcity._m.on(this.input,'focus',function(){
  323. that.input.select();
  324. if(that.input.value == '城市名') that.input.value = '';
  325. });
  326. Vcity._m.on(this.input,'blur',function(){
  327. if(that.input.value == '') that.input.value = '城市名';
  328. });
  329. Vcity._m.on(this.input,'keyup',function(event){
  330. event = event || window.event;
  331. var keycode = event.keyCode;
  332. Vcity._m.addClass('hide',that.cityBox);
  333. that.createUl();
  334. /* 移除iframe 的hide 样式 */
  335. Vcity._m.removeClass('hide',that.myIframe);
  336. // 下拉菜单显示的时候捕捉按键事件
  337. if(that.ul && !Vcity._m.hasClass('hide',that.ul) && !that.isEmpty){
  338. that.KeyboardEvent(event,keycode);
  339. }
  340. });
  341. },
  342. /* *
  343. * 生成下拉选择列表
  344. * @ createUl
  345. * */
  346. createUl:function () {
  347. //console.log('createUL');
  348. var str;
  349. var value = Vcity._m.trim(this.input.value);
  350. // 当value不等于空的时候执行
  351. if (value !== '') {
  352. var reg = new RegExp("^" + value + "|\\|" + value, 'gi');
  353. // 此处需设置中文输入法也可用onpropertychange
  354. var searchResult = [];
  355. for (var i = 0, n = Vcity.allCity.length; i < n; i++) {
  356. if (reg.test(Vcity.allCity[i])) {
  357. var match = Vcity.regEx.exec(Vcity.allCity[i]);
  358. if (searchResult.length !== 0) {
  359. str = '<li><b class="cityname">' + match[1] + '</b><b class="cityspell">' + match[2] + '</b></li>';
  360. } else {
  361. str = '<li class="on"><b class="cityname">' + match[1] + '</b><b class="cityspell">' + match[2] + '</b></li>';
  362. }
  363. searchResult.push(str);
  364. }
  365. }
  366. this.isEmpty = false;
  367. // 如果搜索数据为空
  368. if (searchResult.length == 0) {
  369. this.isEmpty = true;
  370. str = '<li class="empty">对不起,没有找到数据 "<em>' + value + '</em>"</li>';
  371. searchResult.push(str);
  372. }
  373. // 如果slideul不存在则添加ul
  374. if (!this.ul) {
  375. var ul = this.ul = document.createElement('ul');
  376. ul.className = 'cityslide';
  377. this.rootDiv && this.rootDiv.appendChild(ul);
  378. // 记录按键次数,方向键
  379. this.count = 0;
  380. } else if (this.ul && Vcity._m.hasClass('hide', this.ul)) {
  381. this.count = 0;
  382. Vcity._m.removeClass('hide', this.ul);
  383. }
  384. this.ul.innerHTML = searchResult.join('');
  385. /* IE6 */
  386. this.changeIframe();
  387. // 绑定Li事件
  388. this.liEvent();
  389. }else{
  390. Vcity._m.addClass('hide',this.ul);
  391. Vcity._m.removeClass('hide',this.cityBox);
  392. Vcity._m.removeClass('hide',this.myIframe);
  393. this.changeIframe();
  394. }
  395. },
  396. /* IE6的改变遮罩SELECT 的 IFRAME尺寸大小 */
  397. changeIframe:function(){
  398. if(!this.isIE6)return;
  399. this.myIframe.style.width = this.rootDiv.offsetWidth + 'px';
  400. this.myIframe.style.height = this.rootDiv.offsetHeight + 'px';
  401. },
  402. /* *
  403. * 特定键盘事件,上、下、Enter键
  404. * @ KeyboardEvent
  405. * */
  406. KeyboardEvent:function(event,keycode){
  407. var lis = Vcity._m.$('li',this.ul);
  408. var len = lis.length;
  409. switch(keycode){
  410. case 40: //向下箭头↓
  411. this.count++;
  412. if(this.count > len-1) this.count = 0;
  413. for(var i=0;i<len;i++){
  414. Vcity._m.removeClass('on',lis[i]);
  415. }
  416. Vcity._m.addClass('on',lis[this.count]);
  417. break;
  418. case 38: //向上箭头↑
  419. this.count--;
  420. if(this.count<0) this.count = len-1;
  421. for(i=0;i<len;i++){
  422. Vcity._m.removeClass('on',lis[i]);
  423. }
  424. Vcity._m.addClass('on',lis[this.count]);
  425. break;
  426. case 13: // enter键
  427. this.input.value = Vcity.regExChiese.exec(lis[this.count].innerHTML)[0];
  428. Vcity._m.addClass('hide',this.ul);
  429. Vcity._m.addClass('hide',this.ul);
  430. /* IE6 */
  431. Vcity._m.addClass('hide',this.myIframe);
  432. break;
  433. default:
  434. break;
  435. }
  436. },
  437. /* *
  438. * 下拉列表的li事件
  439. * @ liEvent
  440. * */
  441. liEvent:function(){
  442. var that = this;
  443. var lis = Vcity._m.$('li',this.ul);
  444. for(var i = 0,n = lis.length;i < n;i++){
  445. Vcity._m.on(lis[i],'click',function(event){
  446. event = Vcity._m.getEvent(event);
  447. var target = Vcity._m.getTarget(event);
  448. that.input.value = Vcity.regExChiese.exec(target.innerHTML)[0];
  449. Vcity._m.addClass('hide',that.ul);
  450. /* IE6 下拉菜单点击事件 */
  451. Vcity._m.addClass('hide',that.myIframe);
  452. });
  453. Vcity._m.on(lis[i],'mouseover',function(event){
  454. event = Vcity._m.getEvent(event);
  455. var target = Vcity._m.getTarget(event);
  456. Vcity._m.addClass('on',target);
  457. });
  458. Vcity._m.on(lis[i],'mouseout',function(event){
  459. event = Vcity._m.getEvent(event);
  460. var target = Vcity._m.getTarget(event);
  461. Vcity._m.removeClass('on',target);
  462. })
  463. }
  464. }
  465. };
  466. var test=new Vcity.CitySelector({input:'citySelect'});
  467. var test2=new Vcity.CitySelector({input:'citySelect1'});