前端单词查询功能是怎么搞出来的?😂

0 阅读7分钟

前端单词查询功能是怎么搞出来的?😂

🤔 为啥要做单词查询功能?

说起来你可能不信,我做这个单词查询功能,纯粹是因为自己英语太渣了!😭

每次看英文文档,十个单词里有八个不认识,开着翻译软件切来切去又麻烦得要死。

有天我突然灵光一闪:为啥不能自己搞个单词查询功能呢?

就嵌在页面里,鼠标一划就出解释,多方便!

说干就干,于是就有了这个小项目。

其实不光是我这种英语渣渣需要,做国际化网站的时候,这个功能也超实用。

用户看到不认识的词,不用跳转到别的地方,直接在当前页面就能搞懂,体验瞬间提升一个档次有没有!🚀

🧩 核心思路是啥样的? 做这个功能之前,我像个哲学家一样思考了半天:一个单词查询功能,到底需要啥? 想了想,无非就是这几步:

  1. 用户划选了一个单词(得知道用户想查啥吧)
  2. 把这个单词拿过来(得拿到用户选的内容吧)
  3. 查一下这个单词是啥意思(得有个字典吧)
  4. 把结果展示给用户看(得让用户看见吧)

是不是很简单?

就像你想知道一个东西多少钱,先指着它(选单词),然后问老板(查字典),老板告诉你(展示结果)。😎

✋ 怎么知道用户选了啥单词?

首先要解决的问题是:怎么知道用户选了哪个单词?总不能让用户手动输入吧,那也太 low 了。

我发现浏览器其实早就帮我们想好了,有个叫 "选择对象" 的东西,大概长这样:

当用户划选文字时: 

获取选择对象 = 浏览器提供的选择工具 
选中的文字 = 从选择对象里提取文本 
如果选中的文字是个单词(不是一句话)--> 记录下来这个单词 

是不是很神奇?浏览器就像个热心的小助手,用户做了啥它都门儿清。

不过这里有个小坑,就是得判断用户选的是不是一个单词,总不能用户划了一整段话,我们也傻乎乎地去查吧。😂

判断是不是单词也简单,就看有没有空格啥的,纯字母组成的基本就是单词了。

🔍 去哪儿查单词意思呢?

知道了用户要查啥,接下来就是去哪儿查意思了。

总不能自己一个个敲字典进去吧,那不得累死?

有两种办法:

第一种是用别人做好的字典接口

当需要查单词时: 

调用远程字典接口(参数:要查的单词) 
等待接口返回结果
如果成功返回 -- >处理结果 ; 如果失败 --> 告诉用户"查不到哦~" 

这种方法的好处是省事,不用自己准备数据;

坏处是得看别人脸色,如果接口挂了,我们的功能也跟着歇菜。😅

第二种是自己搞个小字典,把常用的单词和意思存起来

创建一个本地字典 = { "apple": "苹果,一种水果", "banana": "香蕉,黄色的弯月亮", ...更多单词 } 

当需要查单词时--> 如果本地字典里有这个单词,直接拿意思;
否则: 告诉用户"这个词太生僻啦,我也不认识~" 

这种方法的好处是稳定,不怕别人的接口挂掉;

坏处是单词量有限,太生僻的词查不到。

我最后选了折中方案:平时用本地字典应付常用词,遇到本地没有的,就偷偷调用一下远程接口,假装都是自己知道的。😜

🖼️ 怎么把结果展示给用户?

查到意思之后,就得想办法展示给用户看了。

总不能在控制台打印吧,用户又看不到。

最常见的做法是搞个小弹窗:

当拿到单词意思后:

创建一个小弹窗元素
弹窗里放:单词 + 意思 + 发音提示 
把弹窗放在用户选中的单词旁边 
当用户点击其他地方时: 关掉弹窗 

这个弹窗的位置很关键,不能挡着用户看别的内容。

还可以加点小动画,让弹窗弹出来的时候有个淡入效果,关掉的时候有个淡出效果,看起来就不会那么生硬。✨

⚡ 性能优化小技巧

延迟开关

刚开始做的时候,我发现有时候会很卡,特别是划选特别快的时候,屏幕上会弹出一堆弹窗。

后来想了个办法:加个小开关!

创建一个开关 = 允许查询 
当用户开始划选时: 如果开关是关闭的: 啥也不做 
否则: 关闭开关 
开始查询流程 
当查询完成并且弹窗显示后: 等待一小会儿(比如300毫秒) 
打开开关 

这样就不会因为用户划得太快,导致同时触发好几个查询了。

就像公共厕所的隔间,一次只能进一个人,出来了才能进下一个,是不是很形象?🚻

缓存单词

创建一个缓存 = {}
当需要查单词时
如果缓存里有这个单词 --> 直接用缓存的结果
否则 --> 去查意思
查到后,把结果存到缓存里 

🎭 一些锦上添花的功能

有想要看我具体实现其中的功能可以评论区里走一波💞

🎵发音功能:不光告诉你意思,还能点一下听发音。

原理就是找到单词的发音文件地址,然后播放一下。

当用户点击发音按钮时:
获取这个单词的发音文件地址 
创建一个音频播放器 (💢重点是播放器组件) 
播放这个发音文件 

🌟保存生词:遇到好记的单词,可以点个星星保存起来,以后统一复习。

当用户点击保存按钮 --> 把当前单词ID存储到收藏数据库中
显示一个"已保存"的提示弹窗

切换词典:有些人可能习惯用柯林斯,有些人喜欢用牛津,那就做个切换功能,想换就换。

当用户选择不同词典时 --> 记录用户的选择 
下次查询时,用用户选的词典
  • 这里面最重要的是要准备词典库词典库选择表

这些功能虽然小,但能让用户感觉很贴心,就像去餐厅吃饭,服务员不仅给你上菜,还主动给你递纸巾一样。😌

🚫 踩过的那些坑

做这个功能的时候,我踩了不少坑,说出来让你们乐呵乐呵:

有一次,我发现中文也会被当成单词查,比如用户划选 "你好",也会弹个窗说查不到。

后来才发现,切分单词时,有时页面中会有中文引用的情况,所以会出现中文分切的不明情况。

添加条件 --> 如果包含中文字符,就不查询。

还有一次,在手机上测试的时候,发现弹窗老是跑到屏幕外面去。

原来手机屏幕小,有时候单词在屏幕边缘,弹窗就放不下了。

添加条件 --> 如果弹窗会超出屏幕,就换个方向显示,比如本来想显示在单词下面,改成显示在上面。

最搞笑的是,有次我把查询按钮做成了红色,结果有用户反馈说太刺眼了,像个警告按钮。

后来改成了温柔的蓝色,立马没人吐槽了。

看来做前端不仅要懂代码,还得懂点心理学和美学啊!😅

🎯 总结一下

做一个单词查询功能,其实不难,主要就是:

  • 监听用户的选择
  • 获取单词并查询意思
  • 优雅地展示结果
  • 处理各种特殊情况

虽然听起来简单,但要做好也不容易,得考虑性能、兼容性、用户体验等方方面面。

不过当你看到自己做的功能被人用到,并且确实帮到他们的时候,那种成就感是没法形容的!

就像自己做的菜被人吃光,还连声说好吃一样。😋

如果你也想做个类似的功能,不妨从最简单的版本开始,慢慢迭代优化。

相信我,当你看到它一点点变好,会很有成就感的!

最后,祝大家英语越来越好,再也不用天天查单词!

当然,要是真那样,我这个功能可就没用武之地了,哈哈!开玩笑的,祝大家学习进步!📈