淘宝搜索框效果实现分析


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中的107个基础知识收集整理 推荐
Mar 29 Javascript
js图片向右一张张滚动效果实例代码
Nov 23 Javascript
jquery控制display属性为none或block
Mar 31 Javascript
yepnope.js使用详解及示例分享
Jun 23 Javascript
JavaScript中的null和undefined区别介绍
Jan 01 Javascript
js实现的简洁网页滑动tab菜单效果代码
Aug 24 Javascript
jQuery实现图片预加载效果
Nov 27 Javascript
Bootstrap每天必学之轮播(Carousel)插件
Apr 25 Javascript
jQuery文字横向滚动效果的实现代码
May 31 Javascript
jQuery+CSS3实现仿花瓣网固定顶部位置带悬浮效果的导航菜单
Sep 21 Javascript
ES6新特性:使用export和import实现模块化详解
Jul 31 Javascript
深入理解JavaScript 箭头函数
May 30 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 object转数组示例
2014/01/15 PHP
typecho插件编写教程(六):调用接口
2015/05/28 PHP
Yii使用smsto短信接口的函数demo示例
2016/07/13 PHP
详解php中 === 的使用
2016/10/24 PHP
php 微信公众平台开发模式实现多客服的实例代码
2016/11/07 PHP
在IIS下安装PHP扩展的方法(超简单)
2017/04/10 PHP
基于PHP实现解密或加密Cloudflar邮箱保护
2020/06/24 PHP
关于jquery input textare 事件绑定及用法学习
2013/04/03 Javascript
JS获取农历日期具体实例
2013/11/14 Javascript
jQuery插件开发发送短信倒计时功能代码
2017/05/09 jQuery
Vue用v-for给循环标签自身属性添加属性值的方法
2018/10/18 Javascript
微信小程序解除10个请求并发限制
2018/12/18 Javascript
node.js连接mysql与基本用法示例
2019/01/05 Javascript
微信小程序中使用Async-await方法异步请求变为同步请求方法
2019/03/28 Javascript
jquery+ajax实现上传图片并显示上传进度功能【附php后台接收】
2019/06/06 jQuery
js实现指定时间倒计时效果
2019/08/26 Javascript
基于layui的table插件进行复选框联动功能的实现方法
2019/09/19 Javascript
react实现同页面三级跳转路由布局
2019/09/26 Javascript
file-loader打包图片文件时路径错误输出为[object-module]的解决方法
2020/01/03 Javascript
JS数组方法join()用法实例分析
2020/01/18 Javascript
JavaScript装箱及拆箱boxing及unBoxing用法解析
2020/06/15 Javascript
[01:23:35]Ti4主赛事胜者组 DK vs EG 1
2014/07/19 DOTA
python中子类调用父类函数的方法示例
2017/08/18 Python
python+pygame简单画板实现代码实例
2017/12/13 Python
django创建最简单HTML页面跳转方法
2019/08/16 Python
Django之使用内置函数和celery发邮件的方法示例
2019/09/16 Python
CentOS7下安装python3.6.8的教程详解
2020/01/03 Python
销售所有的狗狗产品:Dog.com
2016/10/13 全球购物
波兰运动鞋网上商店:e-Sporting
2018/02/16 全球购物
历史学专业毕业生求职信
2013/09/27 职场文书
解除劳动合同协议书范本2014
2014/09/25 职场文书
2014普法依法治理工作总结
2014/12/18 职场文书
2016年感恩父亲节活动总结
2016/04/01 职场文书
python之基数排序的实现
2021/07/26 Python
2022年四月新番
2022/03/15 日漫
python神经网络ResNet50模型
2022/05/06 Python