淘宝搜索框效果实现分析


Posted in Javascript onMarch 05, 2011

淘宝的搜索框就用到了这样一种设计:
淘宝搜索框效果实现分析
这种设计一般是用javascript监控了输入框的focus和blur事件:

<input type="text" id="q" value="请输入关键字" /> 
<script type="text/javascript">//<![CDATA[ 
$("#q").onfocus = function() { 
if ("请输入关键字" == this.value) { 


this.value = ""; 

} 
}; 
$("#q").onblur = function() { 

if ("" == this.value) { 


this.value = "请输入关键字"; 

} 
}; 
//]]></script>

这段代码有两个很明显的缺点:

  1. “请输入关键字”这段提示共出现了3次,一旦要改这段文字就得改3个地方,维护显得非常不便
  2. 为了性能优化,我们会把javascript部分放到页面末尾。然而,像门户网站首页这种代码量很大的页面,末尾的javascript很可能会延时1-2秒执行。在这段时间内,即使焦点在输入框内,提示文字也不会消失,用户需要手动删除这段文字再输入内容

淘宝的输入框则采取了另一种做法,它不把这段提示文字作为输入框的value值,而是放在另一个标签内,再用绝对定位把这段文字叠到输入框上:
淘宝搜索框效果实现分析
从上面的代码可以看到,提示文字在label标签内,这样做有两个好处:

  1. 良好的结构性。既不是div不是span,对input的说明就应该用label
  2. 良好的用户体验。由于设置了for属性,当用户点击label的时候,就会自动focus到输入框。

javascript要控制的其实就是label的显示和隐藏,再也不需要管那段提示文字的内容了:

$("#q").onfocus = function() { 
$("label[for=q]")[0].style.display = 'none'; 
}; 
$("#q").onblur = function() { 

if ("" == this.value) { 


$("label[for=q]")[0].style.display = ''; 

} 
};

javascript是简洁了,但用户体验呢?在javascript执行前,那段提示文字也是无论如何都不会消失,用户也是想删掉这段文字,但是他们删不了,因为这些文字实际上并不在输入框内,而他们输入的内容会被提示文字挡住了。我个人认为这给用户带来了很大的疑惑。
淘宝搜索框效果实现分析
Javascript 相关文章推荐
javascript 跨浏览器开发经验总结(五) js 事件
May 19 Javascript
Extjs NumberField后面加单位实现思路
Jul 30 Javascript
JS+DIV实现鼠标划过切换层效果的实例代码
Nov 26 Javascript
为JS扩展Array.prototype.indexOf引发的问题及解决办法
Jan 21 Javascript
学习JavaScript设计模式之享元模式
Jan 18 Javascript
JS中使用mailto实现将用户在网页中输入的内容传递到本地邮件客户端
Oct 08 Javascript
解决vue页面DOM操作不生效的问题
Mar 17 Javascript
vue中element-ui表格缩略图悬浮放大功能的实例代码
Jun 26 Javascript
微信小程序实现简易table表格
Jun 19 Javascript
回顾Javascript React基础
Jun 15 Javascript
Vue的props父传子的示例代码
May 20 Javascript
实例讲解React 组件
Jul 07 Javascript
再论Javascript下字符串连接的性能
Mar 05 #Javascript
再论Javascript的类继承
Mar 05 #Javascript
Array的push与unshift方法性能比较分析
Mar 05 #Javascript
js定义对象或数组直接量时各浏览器对多余逗号的处理(json)
Mar 05 #Javascript
判断用户是否在线的代码
Mar 05 #Javascript
判断用户的在线状态 onbeforeunload事件
Mar 05 #Javascript
在多个页面使用同一个HTML片段《续》
Mar 04 #Javascript
You might like
PHP模板引擎Smarty中变量的使用方法示例
2016/04/11 PHP
详解PHP发送邮件知识点
2018/05/06 PHP
CentOS7系统搭建LAMP及更新PHP版本操作详解
2020/03/26 PHP
JavaScript中的函数重载深入理解
2014/08/04 Javascript
TinyMCE汉化及本地上传图片功能实例详解
2016/05/31 Javascript
jQuery删除当前节点元素
2016/12/07 Javascript
Vue应用部署到服务器的正确方式
2017/07/15 Javascript
webpack4+express+mongodb+vue实现增删改查的示例
2018/11/08 Javascript
详解js实时获取并显示当前时间的方法
2019/05/10 Javascript
使用js在layui中实现上传图片压缩
2019/06/18 Javascript
webpack的 rquire.context用法实现工程自动化的方法
2020/02/07 Javascript
小程序跳转到的H5页面再跳转回跳小程序的方法
2020/03/06 Javascript
js面向对象封装级联下拉菜单列表的实现步骤
2021/02/08 Javascript
[43:33]EG vs Spirit Supermajor 败者组 BO3 第一场 6.4
2018/06/05 DOTA
Python网络爬虫神器PyQuery的基本使用教程
2018/02/03 Python
PyQt5+requests实现车票查询工具
2019/01/21 Python
PyTorch-GPU加速实例
2020/06/23 Python
Python调用百度OCR实现图片文字识别的示例代码
2020/07/17 Python
python之语音识别speech模块
2020/09/09 Python
美国最受欢迎的童装品牌之一:The Children’s Place
2016/07/23 全球购物
加拿大健康、婴儿和美容产品在线购物:Well.ca
2016/11/30 全球购物
Mixbook加拿大:照片书,照片卡,剪贴簿,年历和日历
2017/02/21 全球购物
GafasWorld西班牙:购买太阳镜、眼镜和隐形眼镜
2019/09/08 全球购物
私有程序集与共享程序集有什么区别
2013/04/05 面试题
毕业求职自荐信格式是什么
2013/11/19 职场文书
大客户销售经理职责
2013/12/04 职场文书
中学生团员自我评价分享
2013/12/07 职场文书
致百米运动员广播稿
2014/01/29 职场文书
志愿者服务感言
2014/02/27 职场文书
城市精细化管理实施方案
2014/03/04 职场文书
初一学生评语大全
2014/04/24 职场文书
教师专业自荐信
2014/05/31 职场文书
面试感谢信范文
2015/01/22 职场文书
运动会主持人开幕词
2016/03/04 职场文书
2016年“6.26”禁毒宣传月系列活动总结
2016/04/05 职场文书
Android RecyclerView实现九宫格效果
2022/06/28 Java/Android