谷歌音乐搜索栏的提示功能php修正代码


Posted in PHP onMay 09, 2011

问题描述

在加载页面的时候, 将光标快速定位到搜索栏上, 待页面加载完成, 搜索栏进行初始化后会显示搜索提示. 此时输入的任何内容将成为搜索提示的一部分而不是搜索关键字. 截图如下:

谷歌音乐搜索栏的提示功能php修正代码

导致原因

搜索栏的 JavaScript 初始化执行在 onload 的时候. 因为页面图片请求多, 完全加载需要 3 秒钟左右, 并且搜索栏的 tabindex 被设为 1, 搜索优先的用户很容易就能遇到.

以下是我根据自己的理解反编译出来的 JS 代码, 页面在 onload 的时候将会执行 m.hint.initHint 方法为搜索框添加提示功能.

/** 
* 为搜索框添加提示功能 
* @param searchTip 提示信息 
* @param searchBoxId 搜索输入框 ID 
* @param hideBoxId 关键字隐藏框 ID 
*/ 
m.hint.initHint = function(searchTip, searchBoxId, hideBoxId){ 
var searchBox = document.getElementById(searchBoxId); 
var hideBox = null; 
if(searchBox){ 
if(hideBoxId) { 
hideBox = document.getElementById(hideBoxId); 
} 
l.events.listen(searchBox, "blur", l.bind(m.hint.onInputBlur, null, searchBox, hideBox), false); 
l.events.listen(searchBox, "focus", l.bind(m.hint.onInputFocus, null, searchBox, hideBox), false); 
if(hideBox){ 
l.events.listen(searchBox, "change", bind(m.hint.onInputChange, null, searchBox, hideBox), false); 
hideBox.value = m.hint.getInputValue(searchBox); 
} // 在这里将搜索提示赋给临时变量 
m.hint.Gh[searchBox] = searchTip; 
// 如果搜索框存在, 则为搜索框加上临时变量和灰色字的 class 
m.hint.onInputBlur(searchBox); 
} 
}; 
m.hint.onInputBlur = function(searchBox, hideBox) { 
m.hint.fi(searchBox); 
hideBox && m.hint.onInputChange(searchBox, hideBox); 
}; 
m.hint.fi = function(searchBox) { 
if(searchBox) { 
var searchTip = m.hint.Gh[searchBox]; 
if(searchTip && (searchBox.value.trim()=="" || searchBox.value==searchTip)) { 
searchBox.setAttribute(m.hint.IS_HINT, "1"); 
searchBox.className += " hint"; 
searchBox.value = searchTip; 
} 
} 
};

解决办法
缩短搜索框 DOM 节点加载和 JavaScript 初始化之间的时间. 可以在搜索框加载完成后立刻执行 JS, 反正 Google 自己的产品也不需要 SEO. 当然, 最好在 DOM ready 的时候执行.

扩展知识
记得我写过一篇文章, 介绍如何在 WordPress 搜索框添加文字提示. 我的处理办法简单粗暴, 仅以框内关键字来判断是关键字还是提示信息. (所以我的提示信息很长)

在分析这个案例的过程中, 我发现 Google 的处理办法很好, 可以借鉴和使用. 它通过隐藏输入框来放置真正的搜索信息, 所以可以实现完全关键字和提示文案的区分.

后话
这个小问题已经困扰我很久了 (几乎每次遇到), 今天终于忍不住看了一下代码, 希望 Google 的工程师能够看到本文快速解决掉. (修改建议我都给出来了, 还不改也说不过去吧)

PHP 相关文章推荐
PHP+DBM的同学录程序(3)
Oct 09 PHP
用PHP实现将GB编码转换为UTF8
Nov 25 PHP
PHP如何编写易读的代码
Jul 10 PHP
用php实现的获取网页中的图片并保存到本地的代码
Jan 05 PHP
php excel类 phpExcel使用方法介绍
Aug 21 PHP
php面象对象数据库操作类实例
Dec 02 PHP
php实现以只读方式打开文件的方法
Mar 16 PHP
PHP微信开发之有道翻译
Jun 23 PHP
php curl中gzip的压缩性能测试实例分析
Nov 08 PHP
phpmailer绑定邮箱的实现方法
Dec 01 PHP
php中目录操作opendir()、readdir()及scandir()用法示例
Jun 08 PHP
Yii框架常见缓存应用实例小结
Sep 09 PHP
php 随机排序广告的实现代码
May 09 #PHP
php中强制下载文件的代码(解决了IE下中文文件名乱码问题)
May 09 #PHP
PHP新手入门学习方法
May 08 #PHP
php在多维数组中根据键名快速查询其父键以及父键值的代码
May 07 #PHP
php 大数据量及海量数据处理算法总结
May 07 #PHP
php 截取字符串并以零补齐str_pad() 函数
May 07 #PHP
php调用mysql数据 dbclass类
May 07 #PHP
You might like
PHP判断变量是否为0的方法
2014/02/08 PHP
Yii实现多按钮保存与提交的方法
2014/12/03 PHP
lib.utf.js
2007/08/21 Javascript
JavaScript 入门·JavaScript 具有全范围的运算符
2007/10/01 Javascript
使用js获取地址栏中传递的值
2013/07/02 Javascript
js父页面与子页面不同时显示的方法
2014/10/16 Javascript
微信中一些常用的js方法汇总
2015/03/12 Javascript
利用JavaScript脚本实现滚屏效果的方法
2015/07/07 Javascript
JavaScript中的return语句简单介绍
2015/12/07 Javascript
基于JavaScript实现弹出框效果
2016/02/19 Javascript
总结JavaScript三种数据存储方式之间的区别
2016/05/03 Javascript
基于JavaScript实现全选、不选和反选效果
2017/02/15 Javascript
JavaScript箭头(arrow)函数详解
2017/06/04 Javascript
Mobile Web开发基础之四--处理手机设备的横竖屏问题
2017/08/11 Javascript
详解ES6中的三种异步解决方案
2018/06/28 Javascript
vue2.0 下拉框默认标题设置方法
2018/08/22 Javascript
js实现简单进度条效果
2020/03/25 Javascript
[54:15]DOTA2-DPC中国联赛 正赛 DLG vs Dragon BO3 第二场2月1日
2021/03/11 DOTA
python输出当前目录下index.html文件路径的方法
2015/04/28 Python
python实现二维码扫码自动登录淘宝
2016/12/27 Python
django rest framework之请求与响应(详解)
2017/11/06 Python
python 顺时针打印矩阵的超简洁代码
2018/11/14 Python
Python深拷贝与浅拷贝用法实例分析
2019/05/05 Python
python 中的paramiko模块简介及安装过程
2020/02/29 Python
css3动画 小球滚动 js控制动画暂停
2019/11/29 HTML / CSS
英国床垫和床架购物网站:Bedman
2019/11/04 全球购物
英国运动风奢侈品购物网站:Maison De Fashion
2020/08/28 全球购物
学校师德师风自我剖析材料
2014/09/29 职场文书
党的群众路线剖析材料
2014/10/09 职场文书
合理化建议书
2015/02/04 职场文书
国庆节慰问信
2015/02/15 职场文书
超市员工管理制度
2015/08/06 职场文书
2016年公司新年寄语
2015/08/17 职场文书
优秀团员主要事迹材料
2015/11/05 职场文书
责任书格式
2019/04/18 职场文书
Python实现列表拼接和去重的三种方式
2021/07/02 Python