web 版微信通讯录

无聊做了个 web 版的功能跟微信里面那个差不多的通讯录。

这个通讯录现在长这个样子:


幼年期

以后可能就是这个样子了(我不保证):


完全体

如果我最后放弃改进它,你可以在这里找到源码,然后自己作修改。

这件事情的由来是,公司的设计师在之前的项目里想实现一个跟微信通讯录一样的页面。我没多少把握能在 web 端实现跟微信原生一样的功能效果:可以想象东西做出来能覆盖微信原生 80% 的功能,但剩下的 20% 会被设计师挑刺当成是 bug ,(比如姓氏的正确分类,比如多个同姓的人的先后排序,比如多音字的处理,比如姓氏首字母切换的效果),要实现这 20% 的功能效果很费力气。所以当时就明说要做到一模一样有困难,要么多给我点时间做,要么做一个十分简单的带个搜索功能的列表。最终选了后者。

这周处于迭代中间,有点空闲时间,回想这个通讯录功能,感觉可以做做。于是先到网上搜搜有没有现成可靠的插件,发现竟然没有。

为什么这个功能会没有人做呢?忽然就产生自己来做一个的想法。要是做出来能用,也是挺好的。

这个功能(或者说是前端插件),首先是要方便 Rails 用户使用,假设有一个不怎么懂前端的后端工程师,他只需要做一件事:提供一个联系人数组,每个元素有 id/name/url 等等属性就行。其余的事情交给这个插件。

然后我打算只用原生 javascript 实现所有的功能。这样可以练习一下在没有 jQuery/underscore 的情况下写代码。

然后是把这个功能做正确:

  • 联系人按姓名正确分类
  • 点索引要跳转到正确的分类
  • 当前类别要在顶栏显示
  • 要有检索过滤功能

以上目标在动手前先写下来,然后一个个地实现,这样在断断续续的开发中也不会乱了优先级。

真正动手时遇到几个问题:

  • 把中文姓氏正确分类
    最初想法是找一个常用汉字与拼音一一对应的哈希表,遇到中文只需要查查表就行,虽然要引入大约十几KB的数据,但查表时间复杂度低。可惜找了一圈没找到合适的。

后来在 ruby-china 论坛找到一个聪明的方法,用几行代码就可以找到中文字的拼音首字母。我在以下几个环境测试了下都没有问题:

  • iOS 10 的 safari

  • iOS 10 的微信,版本 6.3.30

  • android 5.0 的 chrome , 版本 51

  • android 5.0 的微信,版本 6.3.30

  • 点击索引跳转到相应类别
    这个用 html 原生的 anchor 实现,灵感来自 MDN 。

  • 实时更新当前类别
    要随着页面滚动更新顶栏的当前类别,不可避免要监听页面的 scroll 事件。 scroll 事件会在页面滚动过程中被频繁触发,可以用 underscore 的 throttle 来限制因事件触发而调用其他方法的频率,但我不想引入 underscore 。
    在 MDN 上看到优化后的监听 scroll 事件的方式,思路是利用 requestAnimationFrame 方法设置开关,这个方法会在浏览器渲染下一帧前调用。也就是说可以利用它使得由 scroll 事件触发执行的事件在每一帧都只被执行一次。

  • 图标
    实现搜索功能才发现没有搜索常用的“放大镜”图标,无论是使用字体图标还是 svg/png 图标,都意味着又得引入别的资源。看样子这个图标不就是个圆圈加根棍子么?自己动手用CSS画。

我大致想了下未来这个插件会变成怎样,一是要把UI做得跟微信差不多,现在的太朴素了点。

然后对同属一个类别下的联系人排序。排序是个有意思的工作,要选那些可以实现快速插入新元素的算法。

不过在此之前,得先写一篇介绍这个插件的文章,宣传一下这个好东西。我现在很想在付出更大努力前,想办法知道值不值得。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 196,397评论 5 462
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,585评论 2 373
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 143,521评论 0 325
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,645评论 1 267
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,489评论 5 358
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,366评论 1 274
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,787评论 3 387
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,432评论 0 255
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,732评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,775评论 2 314
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,550评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,393评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,802评论 3 300
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,036评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,324评论 1 253
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,757评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,958评论 2 336

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,147评论 25 707
  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 11,952评论 4 60
  • WebSocket-Swift Starscream的使用 WebSocket 是 HTML5 一种新的协议。它实...
    香橙柚子阅读 23,577评论 8 183
  • 若你懂我 正如一缕阳光 没有黑暗 也没雨的悲伤 若你懂我 今夜不必逃亡 在温柔之乡 想你在身旁 若你懂我 有个地方...
    文山鹿阅读 517评论 17 10
  • 谷神不死,是谓玄牝(pin四声),玄牝之门,是谓天地之根。绵绵呵若存,用之不勤。 译文:神,灵验,妙验。牝,雌性的...
    叶子的spring阅读 2,069评论 0 3