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 相关文章推荐
HTML node相关的一些资料整理
Jan 01 Javascript
Javascript 读书笔记索引贴
Jan 11 Javascript
JQuery Dialog的内存泄露问题解决方法
Jun 18 Javascript
WEB高性能开发之疯狂的HTML压缩
Jun 19 Javascript
JavaScript对象、属性、事件手册集合方便查询
Jul 04 Javascript
jQuery之排序组件的深入解析
Jun 19 Javascript
利用毫秒减值计算时长的js代码
Sep 22 Javascript
基于vue-element组件实现音乐播放器功能
May 06 Javascript
Vue实现星级评价效果实例详解
Dec 30 Javascript
原生js实现点击轮播切换图片
Feb 11 Javascript
vue2.x 对象劫持的原理实现
Apr 19 Javascript
代码解析React中setState同步和异步问题
Jun 03 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
晶体管单管来复再生式收音机
2021/03/02 无线电
PHP5下$_SERVER变量不再受magic_quotes_gpc保护的弥补方法
2012/10/31 PHP
Yii框架调试心得--在页面输出执行sql语句
2014/12/25 PHP
JS与C#编码解码
2013/12/03 Javascript
动态的创建一个元素createElement及删除一个元素
2014/01/24 Javascript
javascript动态修改Li节点值的方法
2015/01/20 Javascript
jquery+css实现绚丽的横向二级下拉菜单-附源码下载
2015/08/23 Javascript
jquery form表单获取内容以及绑定数据
2016/02/24 Javascript
JavaScript对象数组排序实例方法浅析
2016/06/15 Javascript
谈谈JavaScript的New关键字
2016/08/26 Javascript
原生js实现放大镜效果
2017/01/11 Javascript
JavaScript定义函数_动力节点Java学院整理
2017/06/27 Javascript
jQuery 中msgTips 顶部弹窗效果实现代码
2017/08/14 jQuery
jQuery中 DOM节点操作方法大全
2017/10/12 jQuery
关于react中组件通信的几种方式详解
2017/12/10 Javascript
浅谈es6中export和export default的作用及区别
2018/02/07 Javascript
让webpack+vue-cil项目不再自动打开浏览器的方法
2018/09/27 Javascript
JS实现扫码枪扫描二维码功能
2020/01/03 Javascript
jQuery实现手风琴效果(蒙版)
2020/01/11 jQuery
python使用正则表达式分析网页中的图片并进行替换的方法
2015/03/26 Python
15行Python代码带你轻松理解令牌桶算法
2018/03/21 Python
Python Dataframe 指定多列去重、求差集的方法
2018/07/10 Python
Python字符串对象实现原理详解
2019/07/01 Python
Python利用逻辑回归分类实现模板
2020/02/15 Python
python使用hdfs3模块对hdfs进行操作详解
2020/06/06 Python
英国乐购杂货:Tesco Groceries
2018/11/29 全球购物
电气专业应届生求职信
2013/11/01 职场文书
社区科普工作方案
2014/06/03 职场文书
中文专业自荐书
2014/06/29 职场文书
教师党员学习群众路线心得体会
2014/11/04 职场文书
2015年实习班主任工作总结
2015/04/23 职场文书
军训决心书范文
2015/09/22 职场文书
幼儿园语言教学反思
2016/02/23 职场文书
公司会议开幕词
2016/03/03 职场文书
六年级作文之预言作文
2019/10/25 职场文书
使用Redis实现分布式锁的方法
2022/06/16 Redis