淘宝搜索框效果实现分析


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中的常见排序算法
Mar 27 Javascript
JavaScript进阶教程(第四课第一部分)
Apr 05 Javascript
Jquery实现瀑布流布局(备有详细注释)
Jul 31 Javascript
JS+CSS实现类似QQ好友及黑名单效果的树型菜单
Sep 22 Javascript
JavaScript中的数据类型转换方法小结
Oct 26 Javascript
通过node-mysql搭建Windows+Node.js+MySQL环境的教程
Mar 01 Javascript
Require.JS中的几种define定义方式示例
Jun 01 Javascript
JavaScript变量类型以及变量作用域详解
Aug 14 Javascript
AngularJS中控制器函数的定义与使用方法示例
Oct 10 Javascript
基于cropper.js封装vue实现在线图片裁剪组件功能
Mar 01 Javascript
自定义Vue组件打包、发布到npm及使用教程
May 22 Javascript
vue判断按钮是否可以点击
Apr 09 Vue.js
再论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
关于PHP5 Session生命周期介绍
2010/03/02 PHP
如何修改和添加Apache的默认站点目录
2013/07/05 PHP
原生js拖拽(第一课 未兼容)拖拽思路
2013/03/29 Javascript
ie中js创建checkbox默认选中问题探讨
2013/10/21 Javascript
Javascript中常见的校验如域名、手机、邮箱等等
2014/01/02 Javascript
WordPress中利用AJAX技术进行评论提交的实现示例
2016/01/12 Javascript
JavaScript下的时间格式处理函数Date.prototype.format
2016/01/27 Javascript
javascript 广告移动特效的实现代码
2016/06/25 Javascript
js实现导航栏中英文切换效果
2017/01/16 Javascript
基于easyui checkbox 的一些操作处理方法
2017/07/10 Javascript
js实现本地时间同步功能
2017/08/26 Javascript
浅谈Vue.js中ref ($refs)用法举例总结
2017/12/19 Javascript
js序列化和反序列化的使用讲解
2019/01/19 Javascript
微信小程序制作表格的方法
2019/02/14 Javascript
layui table 表格模板按钮的实例代码
2019/09/21 Javascript
在Vue中使用antv的示例代码
2020/06/29 Javascript
[01:30]DOTA2上海特锦赛现场采访 Loda倾情献唱
2016/03/25 DOTA
python开发之thread实现布朗运动的方法
2015/11/11 Python
Python的Django应用程序解决AJAX跨域访问问题的方法
2016/05/31 Python
Python实现的简单模板引擎功能示例
2017/09/02 Python
Python闭包思想与用法浅析
2018/12/27 Python
Python中的枚举类型示例介绍
2019/01/09 Python
Django Admin中增加导出Excel功能过程解析
2019/09/04 Python
OpenCV+Python--RGB转HSI的实现
2019/11/27 Python
如何使用python3获取当前路径及os.path.dirname的使用
2019/12/13 Python
PyTorch中的padding(边缘填充)操作方式
2020/01/03 Python
opencv+python实现均值滤波
2020/02/19 Python
如何基于matlab相机标定导出xml文件
2020/11/02 Python
Python绘制词云图之可视化神器pyecharts的方法
2021/02/23 Python
金蝶的一道SQL笔试题
2012/12/18 面试题
大学生职业生涯规划书范文
2014/01/14 职场文书
上海世博会志愿者口号
2014/06/17 职场文书
财务统计员岗位职责
2015/04/14 职场文书
水浒传读书笔记
2015/06/25 职场文书
党员公开承诺书(2016最新版)
2016/03/24 职场文书
Vue.Draggable实现交换位置
2022/04/07 Vue.js