淘宝搜索框效果实现分析


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 相关文章推荐
node.js中的dns.getServers方法使用说明
Dec 08 Javascript
JS实现可关闭的对联广告效果代码
Sep 14 Javascript
JavaScript获取URL参数的方法之一
Mar 24 Javascript
React简单介绍
May 24 Javascript
移动端网页开发调试神器Eruda的介绍与使用技巧
Oct 30 Javascript
react+redux的升级版todoList的实现
Dec 18 Javascript
JavaScript实现淘宝京东6位数字支付密码效果
Aug 18 Javascript
vue自定义指令实现方法详解
Feb 11 Javascript
vue如何获取自定义元素属性参数值的方法
May 14 Javascript
Vue项目使用localStorage+Vuex保存用户登录信息
May 27 Javascript
p5.js临摹动态图形实现方法详解
Oct 23 Javascript
vue使用exif获取图片经纬度的示例代码
Dec 11 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
php排序算法(冒泡排序,快速排序)
2012/10/09 PHP
ThinkPHP中limit()使用方法详解
2016/04/19 PHP
PHP基于redis计数器类定义与用法示例
2018/02/08 PHP
jQuery AJAX 调用WebService实现代码
2010/03/24 Javascript
解决3.01版的jquery.form.js中文乱码问题的解决方法
2012/03/08 Javascript
基于jquery的图片轮播 tab切换组件
2012/07/19 Javascript
基于pthread_create,readlink,getpid等函数的学习与总结
2013/07/17 Javascript
Javascript中Array用法实例分析
2015/06/13 Javascript
jQuery插件学习教程之SlidesJs轮播+Validation验证
2016/07/12 Javascript
Javascript json object 与string 相互转换的简单实现
2016/09/27 Javascript
canvas 绘制圆形时钟
2017/02/22 Javascript
详解VueJs异步动态加载块
2017/03/09 Javascript
详解Angular 4.x 动态创建组件
2017/04/25 Javascript
vue.js如何将echarts封装为组件一键使用详解
2017/10/10 Javascript
vue resource post请求时遇到的坑
2017/10/19 Javascript
nodejs实现的连接MySQL数据库功能示例
2018/01/25 NodeJs
Layer弹出层动态获取数据的方法
2018/08/20 Javascript
vue项目,代码提交至码云,iconfont的用法说明
2020/07/30 Javascript
Python高级应用实例对比:高效计算大文件中的最长行的长度
2014/06/08 Python
Python不规范的日期字符串处理类
2014/06/10 Python
Pyhton中防止SQL注入的方法
2015/02/05 Python
Python的Bottle框架中返回静态文件和JSON对象的方法
2015/04/30 Python
python判断设备是否联网的方法
2018/06/29 Python
djang常用查询SQL语句的使用代码
2019/02/15 Python
HTML5标签小集
2011/08/02 HTML / CSS
娇韵诗法国官网:Clarins法国
2019/01/29 全球购物
Android面试题及答案
2015/09/04 面试题
受欢迎的大学生自我评价
2013/12/05 职场文书
公司委托书范本
2014/04/04 职场文书
优秀少先队员主要事迹材料
2014/05/28 职场文书
学校创先争优活动总结
2014/08/28 职场文书
单位在职证明书
2014/09/11 职场文书
奖金申请报告模板
2015/05/15 职场文书
田径运动会广播稿
2015/08/19 职场文书
七年级生物教学反思
2016/02/20 职场文书
人身损害赔偿协议书
2016/03/22 职场文书