jQuery插件實(shí)現(xiàn)適用于移動(dòng)端的地址選擇器
最近在工作中需要用到地址選擇器,像下面這樣的,本想在網(wǎng)上找一個(gè),可是沒找到,于是自己寫了個(gè)jquery插件。
直接上代碼吧:
var provinces = { "A": { "安徽":["合肥市","蕪湖市","蚌埠市","淮南市","馬鞍山市","淮北市","銅陵市","安慶市","黃山市","滁州市","阜陽市","宿州市","巢湖市","六安市","亳州市","池州市","宣城市"] }, "B": { "北京": ["北京市"] }, "C": { "重慶":["重慶市"] }, "F": { "福建":["福州市","廈門市","莆田市","三明市","泉州市","漳州市","南平市","龍巖市","寧德市"] }, "G": { "甘肅":["蘭州市","嘉峪關(guān)市","金昌市","白銀市","天水市","武威市","張掖市","平?jīng)鍪?,"酒泉市","慶陽市","定西市","隴南市","臨夏回族自治州","甘南藏族自治州"], "廣東":["廣州市","深圳市","珠海市","汕頭市","韶關(guān)市","佛山市","江門市","湛江市","茂名市","肇慶市","惠州市","梅州市","汕尾市","河源市","陽江市","清遠(yuǎn)市","東莞市","中山市","潮州市","揭陽市","云浮市"], "廣西":["南寧市","柳州市","桂林市","梧州市","北海市","防城港市","欽州市","貴港市","玉林市","百色市","賀州市","河池市","來賓市","崇左市"], "貴州":["貴陽市","六盤水市","遵義市","安順市","銅仁地區(qū)","黔西南布依族苗族自治州","畢節(jié)地區(qū)","黔東南苗族侗族自治州","黔南布依族苗族自治州"] }, "H": { "海南":["??谑?,"三亞市"], "河北":["石家莊市","唐山市","秦皇島市","邯鄲市","邢臺(tái)市","保定市","張家口市","承德市","滄州市","廊坊市","衡水市"], "河南":["鄭州市","開封市","洛陽市","平頂山市","安陽市","鶴壁市","新鄉(xiāng)市","焦作市","濮陽市","許昌市","漯河市","三門峽市","南陽市","商丘市","信陽市","周口市","駐馬店市"], "黑龍江":["哈爾濱市","齊齊哈爾市","雞西市","鶴崗市","雙鴨山市","大慶市","伊春市","佳木斯市","七臺(tái)河市","牡丹江市","黑河市","綏化市","大興安嶺地區(qū)"], "湖北":["武漢市","黃石市","十堰市","宜昌市","襄樊市","鄂州市","荊門市","孝感市","荊州市","黃岡市","咸寧市","隨州市","恩施土家族苗族自治州","神農(nóng)架"], "湖南":["長(zhǎng)沙市","株洲市","湘潭市","衡陽市","邵陽市","岳陽市","常德市","張家界市","益陽市","郴州市","永州市","懷化市","婁底市","湘西土家族苗族自治州"] }, "J": { "吉林":["長(zhǎng)春市","吉林市","四平市","遼源市","通化市","白山市","松原市","白城市","延邊朝鮮族自治州"], "江蘇":["南京市","無錫市","徐州市","常州市","蘇州市","南通市","連云港市","淮安市","鹽城市","揚(yáng)州市","鎮(zhèn)江市","泰州市","宿遷市"], "江西":["南昌市","景德鎮(zhèn)市","萍鄉(xiāng)市","九江市","新余市","鷹潭市","贛州市","吉安市","宜春市","撫州市","上饒市"] }, "L": { "遼寧":["沈陽市","大連市","鞍山市","撫順市","本溪市","丹東市","錦州市","營(yíng)口市","阜新市","遼陽市","盤錦市","鐵嶺市","朝陽市","葫蘆島市"] }, "N": { "內(nèi)蒙古":["呼和浩特市","包頭市","烏海市","赤峰市","通遼市","鄂爾多斯市","呼倫貝爾市","巴彥淖爾市","烏蘭察布市","興安盟","錫林郭勒盟","阿拉善盟"], "寧夏":["銀川市","石嘴山市","吳忠市","固原市","中衛(wèi)市"] }, "Q": { "青海":["西寧市","海東地區(qū)","海北藏族自治州","黃南藏族自治州","海南藏族自治州","果洛藏族自治州","玉樹藏族自治州","海西蒙古族藏族自治州"] }, "S": { "山東":["濟(jì)南市","青島市","淄博市","棗莊市","東營(yíng)市","煙臺(tái)市","濰坊市","濟(jì)寧市","泰安市","威海市","日照市","萊蕪市","臨沂市","德州市","聊城市","濱州市","菏澤市"], "山西":["太原市","大同市","陽泉市","長(zhǎng)治市","晉城市","朔州市","晉中市","運(yùn)城市","忻州市","臨汾市","呂梁市"], "陜西":["西安市","銅川市","寶雞市","咸陽市","渭南市","延安市","漢中市","榆林市","安康市","商洛市"], "上海":["上海市"], "四川":["成都市","自貢市","攀枝花市","瀘州市","德陽市","綿陽市","廣元市","遂寧市","內(nèi)江市","樂山市","南充市","眉山市","宜賓市","廣安市","達(dá)州市","雅安市","巴中市","資陽市","阿壩藏族羌族自治州","甘孜藏族自治州","涼山彝族自治州"] }, "T": { "天津": ["天津市"] }, "X": { "西藏":["拉薩市","昌都地區(qū)","山南地區(qū)","日喀則地區(qū)","那曲地區(qū)","阿里地區(qū)","林芝地區(qū)"], "新疆":["烏魯木齊市","克拉瑪依市","吐魯番地區(qū)","哈密地區(qū)","昌吉回族自治州","博爾塔拉蒙古自治州","巴音郭楞蒙古自治州","阿克蘇地區(qū)","克孜勒蘇柯爾克孜自治州","喀什地區(qū)","和田地區(qū)","伊犁哈薩克自治州","塔城地區(qū)","阿勒泰地區(qū)","石河子市","阿拉爾市","圖木舒克市","五家渠市"] }, "Y": { "云南":["昆明市","曲靖市","玉溪市","保山市","昭通市","麗江市","思茅市","臨滄市","楚雄彝族自治州","紅河哈尼族彝族自治州","文山壯族苗族自治州","西雙版納傣族自治州","大理白族自治州","德宏傣族景頗族自治州","怒江傈僳族自治州","迪慶藏族自治州"] }, "Z": { "浙江":["杭州市","寧波市","溫州市","嘉興市","湖州市","紹興市","金華市","衢州市","舟山市","臺(tái)州市","麗水市"] } }; (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));
代碼很簡(jiǎn)單。這邊需要提到的一段代碼是:
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()); } }); });
這段是通過字母導(dǎo)航省份的代碼。當(dāng)手指在字母上滑動(dòng)時(shí),touchmove事件并不能確定當(dāng)前的字母是哪個(gè),因?yàn)閑.target永遠(yuǎn)是touchstart時(shí)的那個(gè)字母。所以我不得不通過坐標(biāo)來判斷手指位于哪個(gè)字母上,這樣就導(dǎo)致一個(gè)問題,每次滑動(dòng)都必須遍歷26個(gè)字母的坐標(biāo),這樣效率是非常低的,但是目前我也沒有好的辦法。
該插件的使用方法非常簡(jiǎn)單:
// html代碼 <input type="text" class="city" />
// js代碼 $(".city").CityPicker();
demo: http://demo.jb51.net/js/2016/cityPicker-master/test.html。最好用手機(jī)瀏覽器或者chrome模擬器打開。
如果有需要的朋友,可以從http://www.dbjr.com.cn/jiaoben/430774.html 下載。
相關(guān)文章
jQuery/JS監(jiān)聽input輸入框值變化實(shí)例
在本篇文章里小編給大家整理的是一篇關(guān)于jQuery/JS監(jiān)聽input輸入框值變化實(shí)例內(nèi)容,需要的朋友們學(xué)習(xí)下。2019-10-10Jquey拖拽控件Draggable使用方法(asp.net環(huán)境)
使用時(shí)首先依次引用Jquery,Jquery-Ui ,Draggable三個(gè)Js。然后在js中編寫相應(yīng)的代碼,相關(guān)代碼說明請(qǐng)看程序中的注釋。2010-09-09jQuery經(jīng)過一段時(shí)間自動(dòng)隱藏指定元素的方法
這篇文章主要介紹了jQuery經(jīng)過一段時(shí)間自動(dòng)隱藏指定元素的方法,實(shí)例分析了兩種比較常用的技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2015-03-03js/jq仿window文件夾移動(dòng)/剪切/復(fù)制等操作代碼
本篇文章主要介紹了js/jq仿window文件夾移動(dòng)/剪切/復(fù)制等操作代碼,非常具有實(shí)用價(jià)值,需要的朋友可以參考下。2017-03-03html中的input標(biāo)簽的checked屬性jquery判斷代碼
input 標(biāo)簽具有checked屬性,而當(dāng)input標(biāo)簽的type屬性設(shè)為button時(shí),如果給input標(biāo)簽的checked屬性賦值時(shí),在vs中會(huì)報(bào)錯(cuò),提示 特性checked不是元素input的有效特性2012-09-09jquery parent和parents的區(qū)別分析
從字面上不難看出parent是指取得一個(gè)包含著所有匹配元素的唯一父元素的元素集合。parents則是取得一個(gè)包含著所有匹配元素的祖先元素的元素集合(不包含根元素)??梢酝ㄟ^一個(gè)可選的表達(dá)式進(jìn)行篩選2013-10-10jquery插件bootstrapValidator表單驗(yàn)證詳解
這篇文章主要為大家詳細(xì)介紹了jquery插件bootstrapValidator表單驗(yàn)證,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-12-12