JS实现移动端按首字母检索城市列表附源码下载


Posted in Javascript onJuly 05, 2017

我们常见的手机通讯录或微信通讯录,联系人信息是按字母顺序排列的列表,通过点击右侧的字母,会迅速定位检索到首字母对应的联系人。那么我今天给大家介绍的是按首字母快速定位到城市列表,效果和通讯录一样的。

JS实现移动端按首字母检索城市列表附源码下载 查看演示 下载源码 准备

查看演示     下载源码

准备

首先我们需要用到全国的城市数据,这些城市数据来源于网络,我已经将数据格式化成JSON形式了,大家可以直接拿去用。

我们还需要用到一个叫better-scroll的滚动插件,它能帮我们将超长的页面原生的滚动条处理掉,优化滚动效果。

接着我们准备HTML结构。

<div class="city"> 
 <div class="city-wrapper city-wrapper-hook"> 
 <div class="scroller-hook"> 
 <div class="cities cities-hook"></div> 
 </div> 
 <div class="shortcut shortcut-hook"></div> 
 </div> 
</div>

.cities是用来装载城市数据列表的;.shortcut是用来装载首字母列表的,需要使用CSS将其定位在右边侧。

Javascript

写JS代码之前,先将城市数据city.js和better-scroll加载进来。

<script src="js/bscroll.min.js"> </script> 
<script src="js/city.js"> </script>

开始写js,先定义要用到的变量:

var cityWrapper = document.querySelector('.city-wrapper-hook'); 
var cityScroller = document.querySelector('.scroller-hook'); 
var cities = document.querySelector('.cities-hook'); 
var shortcut = document.querySelector('.shortcut-hook'); 
var scroll; 
var shortcutList = []; 
var anchorMap = {};

函数initCities()循环遍历city.js中的城市数据,提取其中的城市名称、首字母和id信息,一次性加入到数据列表中。接着调用BScroll插件方法。

function initCities() { 
 var y = 0; 
 var titleHeight = 28; 
 var itemHeight = 44; 
 var lists = ''; 
 var en = '<ul>'; 
 cityData.forEach(function (group) { 
 var name = group.name; 
 lists += '<div class="title">'+name+'</div>'; 
 lists += '<ul>'; 
 group.cities.forEach(function(g) { 
 lists += '<li class="item" data-name="'+ g.name +'" data-id="'+ g.cityid +'"><span class="border-1px name">'+ g.name +'</span></li>'; 
 }); 
 lists += '</ul>'; 
 var name = group.name.substr(0, 1); 
 en += '<li data-anchor="'+name+'" class="item">'+name+'</li>'; 
 var len = group.cities.length; 
 anchorMap[name] = y; 
 y -= titleHeight + len * itemHeight; 
 }); 
 en += '</ul>'; 
 cities.innerHTML = lists; 
 shortcut.innerHTML = en; 
 shortcut.style.top = (cityWrapper.clientHeight - shortcut.clientHeight) / 2 + 'px'; 
 scroll = new window.BScroll(cityWrapper, { 
 probeType: 3 //1 会截流,只有在滚动结束的时候派发一个 scroll 事件。2在手指 move 的时候也会实时派发 scroll 事件,不会截流。 3除了手指 move 的时候派发scroll事件,在 swipe(手指迅速滑动一小段距离)的情况下,列表会有一个长距离的滚动动画,这个滚动的动画过程中也会实时派发滚动事件 
 }); 
 scroll.scrollTo(0, 0); 
}

然后函数bindEvent()绑定事件,监听右侧首字母的touchstart和touchmove事件。

function bindEvent() { 
 var touch = {}; 
 var firstTouch; 
 shortcut.addEventListener('touchstart', function (e) { 
 var anchor = e.target.getAttribute('data-anchor'); 
 firstTouch = e.touches[0]; 
 touch.y1 = firstTouch.pageY; 
 touch.anchor = anchor; 
 scrollTo(anchor); 
 }); 
 shortcut.addEventListener('touchmove', function (e) { 
 firstTouch = e.touches[0]; 
 touch.y2 = firstTouch.pageY; 
 var anchorHeight = 16; 
 var delta = (touch.y2 - touch.y1) / anchorHeight | 0; 
 var anchor = shortcutList[shortcutList.indexOf(touch.anchor) + delta]; 
 scrollTo(anchor); 
 e.preventDefault(); 
 e.stopPropagation(); 
 }); 
 function scrollTo(anchor) { 
 var maxScrollY = cityWrapper.clientHeight - cityScroller.clientHeight; 
 var y = Math.min(0, Math.max(maxScrollY, anchorMap[anchor])); 
 if (typeof y !== 'undefined') { 
 scroll.scrollTo(0, y); 
 } 
 } 
}

最后调用执行两个函数。

initCities(); 
bindEvent();

现在使用手机或平板访问就可以看到效果了,如果你要实现的是通讯录效果,可以将联系人数据信息格式化成city.js中对应的json即可。

以上所述是小编给大家介绍的JS实现移动端按首字母检索城市列表,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
js 对象是否存在判断
Jul 15 Javascript
jquery DOM操作 基于命令改变页面
May 06 Javascript
给jqGrid数据行添加修改和删除操作链接(之一)
Nov 04 Javascript
利用javascript实现web页面中指定区域打印
Oct 30 Javascript
Javascript中克隆一个数组的实现代码
Dec 06 Javascript
用jquery实现动画跳到顶部和底部(这个比较简单)
Sep 01 Javascript
window.open()实现post传递参数
Mar 12 Javascript
Javascript中的数据类型之旅
Oct 18 Javascript
Node.js环境下编写爬虫爬取维基百科内容的实例分享
Jun 12 Javascript
详解handlebars+require基本使用方法
Dec 21 Javascript
Avalonjs双向数据绑定与监听的实例代码
Jun 23 Javascript
mock.js模拟数据实现前后端分离
Jul 24 Javascript
webpack教程之webpack.config.js配置文件
Jul 05 #Javascript
webstorm添加vue.js支持的方法教程
Jul 05 #Javascript
vue.js实现刷新当前页面的方法教程
Jul 05 #Javascript
vue router2.0二级路由的简单使用
Jul 05 #Javascript
详解使用Node.js 将txt文件转为Excel文件
Jul 05 #Javascript
AngularJS实现进度条功能示例
Jul 05 #Javascript
AngularJS实现tab选项卡的方法详解
Jul 05 #Javascript
You might like
第五章 php数组操作
2011/12/30 PHP
15 个 JavaScript Web UI 库
2010/05/19 Javascript
关于IE BUG与字符串截取substr的解决办法
2013/04/10 Javascript
javascript 树形导航菜单实例代码
2013/08/13 Javascript
防止jQuery ajax Load使用缓存的方法小结
2014/02/22 Javascript
浅析js预加载/延迟加载
2014/09/25 Javascript
AngularJS入门教程之Hello World!
2014/12/06 Javascript
JavaScript兼容性总结之获取非行间样式案例
2016/08/07 Javascript
jQuery简单倒计时效果完整示例
2016/09/20 Javascript
JS获取鼠标相对位置的方法
2016/09/20 Javascript
jquery鼠标悬停导航下划线滑出效果
2017/09/29 jQuery
Ionic学习日记实现验证码倒计时
2018/02/08 Javascript
基于vue2的canvas时钟倒计时组件步骤解析
2018/11/05 Javascript
JQuery animate动画应用示例
2019/05/14 jQuery
JavaScript动态检测密码强度原理及实现方法详解
2019/06/11 Javascript
微信小程序间使用navigator跳转传值问题实例分析
2020/03/27 Javascript
Node 使用express-http-proxy 做api网关的实现
2020/10/15 Javascript
linux平台使用Python制作BT种子并获取BT种子信息的方法
2017/01/20 Python
python3.6连接MySQL和表的创建与删除实例代码
2017/12/28 Python
利用Python在一个文件的头部插入数据的实例
2018/05/02 Python
django 发送邮件和缓存的实现代码
2018/07/18 Python
python+jinja2实现接口数据批量生成工具
2019/08/28 Python
Python操作excel的方法总结(xlrd、xlwt、openpyxl)
2019/09/02 Python
Python测试Kafka集群(pykafka)实例
2019/12/23 Python
python实现ssh及sftp功能(实例代码)
2020/03/16 Python
Django自关联实现多级联动查询实例
2020/05/19 Python
如何理解Python中包的引入
2020/05/29 Python
mac系统下安装pycharm、永久激活、中文汉化详细教程
2020/11/24 Python
利用python如何实现猫捉老鼠小游戏
2020/12/04 Python
Silk’n激光脱毛器官网:silkn.com
2016/10/06 全球购物
加拿大领先的优质厨具产品在线购物网站:Golda’s Kitchen
2017/11/17 全球购物
毕业生机械建模求职信
2013/10/14 职场文书
中西医专业毕业生职业规划书
2014/02/24 职场文书
解除劳动合同通知书范本
2015/04/16 职场文书
初中军训感言
2015/08/01 职场文书
MySQL CHAR和VARCHAR该如何选择
2021/05/31 MySQL