最近在工作中需要用到地址选择器,像下面这样的,本想在网上找一个,可是没找到,于是自己写了个jquery插件。
直接上代码吧:
var provinces = { \"A\": { \"安徽\":[\"合肥市\",\"芜湖市\",\"蚌埠市\",\"淮南市\",\"马鞍山市\",\"淮北市\",\"铜陵市\",\"安庆市\",\"黄山市\",\"滁州市\",\"阜阳市\",\"宿州市\",\"巢湖市\",\"六安市\",\"亳州市\",\"池州市\",\"宣城市\"] }, \"B\": { \"北京\": [\"北京市\"] }, \"C\": { \"重庆\":[\"重庆市\"] }, \"F\": { \"福建\":[\"福州市\",\"厦门市\",\"莆田市\",\"三明市\",\"泉州市\",\"漳州市\",\"南平市\",\"龙岩市\",\"宁德市\"] }, \"G\": { \"甘肃\":[\"兰州市\",\"嘉峪关市\",\"金昌市\",\"白银市\",\"天水市\",\"武威市\",\"张掖市\",\"平凉市\",\"酒泉市\",\"庆阳市\",\"定西市\",\"陇南市\",\"临夏回族自治州\",\"甘南藏族自治州\"], \"广东\":[\"广州市\",\"深圳市\",\"珠海市\",\"汕头市\",\"韶关市\",\"佛山市\",\"江门市\",\"湛江市\",\"茂名市\",\"肇庆市\",\"惠州市\",\"梅州市\",\"汕尾市\",\"河源市\",\"阳江市\",\"清远市\",\"东莞市\",\"中山市\",\"潮州市\",\"揭阳市\",\"云浮市\"], \"广西\":[\"南宁市\",\"柳州市\",\"桂林市\",\"梧州市\",\"北海市\",\"防城港市\",\"钦州市\",\"贵港市\",\"玉林市\",\"百色市\",\"贺州市\",\"河池市\",\"来宾市\",\"崇左市\"], \"贵州\":[\"贵阳市\",\"六盘水市\",\"遵义市\",\"安顺市\",\"铜仁地区\",\"黔西南布依族苗族自治州\",\"毕节地区\",\"黔东南苗族侗族自治州\",\"黔南布依族苗族自治州\"] }, \"H\": { \"海南\":[\"海口市\",\"三亚市\"], \"河北\":[\"石家庄市\",\"唐山市\",\"秦皇岛市\",\"邯郸市\",\"邢台市\",\"保定市\",\"张家口市\",\"承德市\",\"沧州市\",\"廊坊市\",\"衡水市\"], \"河南\":[\"郑州市\",\"开封市\",\"洛阳市\",\"平顶山市\",\"安阳市\",\"鹤壁市\",\"新乡市\",\"焦作市\",\"濮阳市\",\"许昌市\",\"漯河市\",\"三门峡市\",\"南阳市\",\"商丘市\",\"信阳市\",\"周口市\",\"驻马店市\"], \"黑龙江\":[\"哈尔滨市\",\"齐齐哈尔市\",\"鸡西市\",\"鹤岗市\",\"双鸭山市\",\"大庆市\",\"伊春市\",\"佳木斯市\",\"七台河市\",\"牡丹江市\",\"黑河市\",\"绥化市\",\"大兴安岭地区\"], \"湖北\":[\"武汉市\",\"黄石市\",\"十堰市\",\"宜昌市\",\"襄樊市\",\"鄂州市\",\"荆门市\",\"孝感市\",\"荆州市\",\"黄冈市\",\"咸宁市\",\"随州市\",\"恩施土家族苗族自治州\",\"神农架\"], \"湖南\":[\"长沙市\",\"株洲市\",\"湘潭市\",\"衡阳市\",\"邵阳市\",\"岳阳市\",\"常德市\",\"张家界市\",\"益阳市\",\"郴州市\",\"永州市\",\"怀化市\",\"娄底市\",\"湘西土家族苗族自治州\"] }, \"J\": { \"吉林\":[\"长春市\",\"吉林市\",\"四平市\",\"辽源市\",\"通化市\",\"白山市\",\"松原市\",\"白城市\",\"延边朝鲜族自治州\"], \"江苏\":[\"南京市\",\"无锡市\",\"徐州市\",\"常州市\",\"苏州市\",\"南通市\",\"连云港市\",\"淮安市\",\"盐城市\",\"扬州市\",\"镇江市\",\"泰州市\",\"宿迁市\"], \"江西\":[\"南昌市\",\"景德镇市\",\"萍乡市\",\"九江市\",\"新余市\",\"鹰潭市\",\"赣州市\",\"吉安市\",\"宜春市\",\"抚州市\",\"上饶市\"] }, \"L\": { \"辽宁\":[\"沈阳市\",\"大连市\",\"鞍山市\",\"抚顺市\",\"本溪市\",\"丹东市\",\"锦州市\",\"营口市\",\"阜新市\",\"辽阳市\",\"盘锦市\",\"铁岭市\",\"朝阳市\",\"葫芦岛市\"] }, \"N\": { \"内蒙古\":[\"呼和浩特市\",\"包头市\",\"乌海市\",\"赤峰市\",\"通辽市\",\"鄂尔多斯市\",\"呼伦贝尔市\",\"巴彦淖尔市\",\"乌兰察布市\",\"兴安盟\",\"锡林郭勒盟\",\"阿拉善盟\"], \"宁夏\":[\"银川市\",\"石嘴山市\",\"吴忠市\",\"固原市\",\"中卫市\"] }, \"Q\": { \"青海\":[\"西宁市\",\"海东地区\",\"海北藏族自治州\",\"黄南藏族自治州\",\"海南藏族自治州\",\"果洛藏族自治州\",\"玉树藏族自治州\",\"海西蒙古族藏族自治州\"] }, \"S\": { \"山东\":[\"济南市\",\"青岛市\",\"淄博市\",\"枣庄市\",\"东营市\",\"烟台市\",\"潍坊市\",\"济宁市\",\"泰安市\",\"威海市\",\"日照市\",\"莱芜市\",\"临沂市\",\"德州市\",\"聊城市\",\"滨州市\",\"菏泽市\"], \"山西\":[\"太原市\",\"大同市\",\"阳泉市\",\"长治市\",\"晋城市\",\"朔州市\",\"晋中市\",\"运城市\",\"忻州市\",\"临汾市\",\"吕梁市\"], \"陕西\":[\"西安市\",\"铜川市\",\"宝鸡市\",\"咸阳市\",\"渭南市\",\"延安市\",\"汉中市\",\"榆林市\",\"安康市\",\"商洛市\"], \"上海\":[\"上海市\"], \"四川\":[\"成都市\",\"自贡市\",\"攀枝花市\",\"泸州市\",\"德阳市\",\"绵阳市\",\"广元市\",\"遂宁市\",\"内江市\",\"乐山市\",\"南充市\",\"眉山市\",\"宜宾市\",\"广安市\",\"达州市\",\"雅安市\",\"巴中市\",\"资阳市\",\"阿坝藏族羌族自治州\",\"甘孜藏族自治州\",\"凉山彝族自治州\"] }, \"T\": { \"天津\": [\"天津市\"] }, \"X\": { \"西藏\":[\"拉萨市\",\"昌都地区\",\"山南地区\",\"日喀则地区\",\"那曲地区\",\"阿里地区\",\"林芝地区\"], \"新疆\":[\"乌鲁木齐市\",\"克拉玛依市\",\"吐鲁番地区\",\"哈密地区\",\"昌吉回族自治州\",\"博尔塔拉蒙古自治州\",\"巴音郭楞蒙古自治州\",\"阿克苏地区\",\"克孜勒苏柯尔克孜自治州\",\"喀什地区\",\"和田地区\",\"伊犁哈萨克自治州\",\"塔城地区\",\"阿勒泰地区\",\"石河子市\",\"阿拉尔市\",\"图木舒克市\",\"五家渠市\"] }, \"Y\": { \"云南\":[\"昆明市\",\"曲靖市\",\"玉溪市\",\"保山市\",\"昭通市\",\"丽江市\",\"思茅市\",\"临沧市\",\"楚雄彝族自治州\",\"红河哈尼族彝族自治州\",\"文山壮族苗族自治州\",\"西双版纳傣族自治州\",\"大理白族自治州\",\"德宏傣族景颇族自治州\",\"怒江傈僳族自治州\",\"迪庆藏族自治州\"] }, \"Z\": { \"浙江\":[\"杭州市\",\"宁波市\",\"温州市\",\"嘉兴市\",\"湖州市\",\"绍兴市\",\"金华市\",\"衢州市\",\"舟山市\",\"台州市\",\"丽水市\"] } }; (function ($, win, doc) { var CityPicker = function (el, options) { this.el = $(el); this.options = options; this.provinces = provinces; this.pro = null; this.city = null; this.elType = this.el.is(\'input\'); this.init(); }; var p = CityPicker.prototype; p.init = function () { this.initEvent(); this.preventPopKeyboard(); }; p.preventPopKeyboard = function () { if (this.elType) { this.el.prop(\"readonly\", true); } }; p.initEvent = function () { this.el.on(\"focus\", function (e) { var pickerBox = $(\".picker-box\"); if (pickerBox[0]) { pickerBox.show(); } else { this.create(); } }.bind(this)); }; p.create = function () { this.createCityPickerBox(); this.createProList(); this.proClick(); this.createNavBar(); this.navEvent(); }; p.createCityPickerBox = function () { var proBox = \"<div class=\'picker-box\'></div>\"; $(\"body\").append(proBox); }; p.createProList = function () { var provinces = this.provinces; var proBox; var dl = \"\"; for (var letterKey in provinces) { var val = provinces[letterKey]; if (provinces.hasOwnProperty(letterKey)) { var dt = \"<dt id=\'\" + letterKey + \"\'>\" + letterKey + \"</dt>\"; var dd = \"\"; for (var proKey in val) { if (val.hasOwnProperty(proKey)) { dd += \"<dd data-letter=\" + letterKey + \">\" + proKey + \"</dd>\"; } } dl += \"<dl>\" + dt + dd + \"</dl>\"; } } proBox = \"<section class=\'pro-picker\'>\" + dl + \"</section>\"; $(\".picker-box\").append(proBox); }; p.createCityList = function (letter, pro) { var cities = this.provinces[letter][pro]; var ul, li = \"\"; cities.forEach(function (city, i) { li += \"<li>\" + city + \"</li>\"; }); ul = \"<ul class=\'city-picker\'>\" + li + \"</ul>\"; $(\".picker-box\").find(\".city-picker\").remove().end().append(ul); this.cityClick(); }; p.proClick = function () { var that = this; $(\".pro-picker\").on(\"click\", function (e) { var target = e.target; if ($(target).is(\"dd\")) { that.pro = $(target).html(); var letter = $(target).data(\"letter\"); that.createCityList(letter, that.pro); $(this).hide(); } }); }; p.cityClick = function () { var that = this; $(\".city-picker\").on(\"click\", function (e) { var target = e.target; if ($(target).is(\"li\")) { that.city = $(target).html(); if (that.elType) { that.el.val(that.pro + \"-\" + that.city); } else { that.el.html(that.pro + \"-\" + that.city); } $(\".picker-box\").hide(); $(\".pro-picker\").show(); $(this).hide(); } }); }; p.createNavBar = function () { var str = \"ABCDEFGHIJKLMNOPQRSTUVWXYZ\"; var arr = str.split(\"\"); var a = \"\"; arr.forEach(function (item, i) { a += \'<a href=\"#\' + item + \'\">\' + item + \'</a>\'; }); var div = \'<div class=\"navbar\">\' + a + \'</div>\'; $(\".picker-box\").append(div); }; p.navEvent = function () { var that = this; var navBar = $(\".navbar\"); var width = navBar.find(\"a\").width(); var height = navBar.find(\"a\").height(); navBar.on(\"touchstart\", function (e) { $(this).addClass(\"active\"); that.createLetterPrompt($(e.target).html()); }); navBar.on(\"touchmove\", function (e) { e.preventDefault(); var touch = e.originalEvent.touches[0]; var pos = {\"x\": touch.pageX, \"y\": touch.pageY}; var x = pos.x, y = pos.y; $(this).find(\"a\").each(function (i, item) { var offset = $(item).offset(); var left = offset.left, top = offset.top; if (x > left && x < (left + width) && y > top && y < (top + height)) { location.href = item.href; that.changeLetter($(item).html()); } }); }); navBar.on(\"touchend\", function () { $(this).removeClass(\"active\"); $(\".prompt\").hide(); }) }; p.createLetterPrompt = function (letter) { var prompt = $(\".prompt\"); if (prompt[0]) { prompt.show(); } else { var span = \"<span class=\'prompt\'>\" + letter + \"</span>\"; $(\".picker-box\").append(span); } }; p.changeLetter = function (letter) { var prompt = $(\".prompt\"); prompt.html(letter); }; $.fn.CityPicker = function (options) { return new CityPicker(this, options); } }(window.jQuery, window, document));
代码很简单。这边需要提到的一段代码是:
navBar.on(\"touchmove\", function (e) { e.preventDefault(); var touch = e.originalEvent.touches[0]; var pos = {\"x\": touch.pageX, \"y\": touch.pageY}; var x = pos.x, y = pos.y; $(this).find(\"a\").each(function (i, item) { var offset = $(item).offset(); var left = offset.left, top = offset.top; if (x > left && x < (left + width) && y > top && y < (top + height)) { location.href = item.href; that.changeLetter($(item).html()); } }); });
这段是通过字母导航省份的代码。当手指在字母上滑动时,touchmove事件并不能确定当前的字母是哪个,因为e.target永远是touchstart时的那个字母。所以我不得不通过坐标来判断手指位于哪个字母上,这样就导致一个问题,每次滑动都必须遍历26个字母的坐标,这样效率是非常低的,但是目前我也没有好的办法。
该插件的使用方法非常简单:
// html代码 <input type=\"text\" class=\"city\" />
// js代码 $(\".city\").CityPicker();
demo: http://demo.phpstudy.net/js/2016/cityPicker-master/test.html。最好用手机浏览器或者chrome模拟器打开。
如果有需要的朋友,可以从http://www.phpstudy.net/jiaoben/430774.html 下载。
本文地址:https://www.stayed.cn/item/23052
转载请注明出处。
本站部分内容来源于网络,如侵犯到您的权益,请 联系我