谷歌音乐搜索栏的提示功能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 相关文章推荐
第十一节 重载 [11]
Oct 09 PHP
php zend 相对路径问题
Jan 12 PHP
php xml文件操作实现代码(二)
Mar 20 PHP
使用zend studio for eclipse不能激活代码提示功能的解决办法
Oct 11 PHP
PHP随机生成信用卡卡号的方法
Mar 23 PHP
php使用Jpgraph绘制复杂X-Y坐标图的方法
Jun 10 PHP
使用PHP生成图片的缩略图的方法
Aug 18 PHP
Yii2 rbac权限控制之rule教程详解
Jun 23 PHP
php投票系统之增加与删除投票(管理员篇)
Jul 01 PHP
PHP 搜索查询功能实现
Nov 29 PHP
php微信公众号开发之微信企业付款给个人
Oct 04 PHP
laravel框架中视图的基本使用方法分析
Nov 23 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 关于访问控制的和运算符优先级介绍
2013/07/08 PHP
CI框架常用经典操作类总结(路由,伪静态,分页,session,验证码等)
2016/11/21 PHP
php 数组处理函数extract详解及实例代码
2016/11/23 PHP
基于Web标准的UI组件 — 树状菜单(2)
2006/09/18 Javascript
基于jQuery实现的美观星级评论打分组件代码
2015/10/30 Javascript
JavaScript判断按钮被点击的方法
2015/12/13 Javascript
精通JavaScript的this关键字
2020/05/28 Javascript
Vue中建立全局引用或者全局命令的方法
2017/08/21 Javascript
jquery动态添加以及遍历option并获取特定样式名称的option方法
2018/01/29 jQuery
详解Vue前端对axios的封装和使用
2019/04/01 Javascript
Vue.extend实现挂载到实例上的方法
2019/05/01 Javascript
JavaScrip数组去重操作实例小结
2019/06/20 Javascript
基于JavaScript的数据结构队列动画实现示例解析
2020/08/06 Javascript
python使用PyGame绘制图像并保存为图片文件的方法
2015/04/24 Python
深入解析Python编程中JSON模块的使用
2015/10/15 Python
python爬虫获取京东手机图片的图文教程
2017/12/29 Python
Python socket实现简单聊天室
2018/04/01 Python
Python3.6笔记之将程序运行结果输出到文件的方法
2018/04/22 Python
python如何创建TCP服务端和客户端
2018/08/26 Python
python实现对图片进行旋转,放缩,裁剪的功能
2019/08/07 Python
Python turtle库绘制菱形的3种方式小结
2019/11/23 Python
python 实现将小图片放到另一个较大的白色或黑色背景图片中
2019/12/12 Python
python中安装django模块的方法
2020/03/12 Python
实例讲解使用CSS实现多边框和透明边框的方法
2015/09/08 HTML / CSS
CSS3中Transition动画属性用法详解
2016/07/04 HTML / CSS
美国爆米花工厂:The Popcorn Factory
2019/09/14 全球购物
幼儿教师考核制度
2014/01/25 职场文书
银行进社区活动总结
2014/07/07 职场文书
光学与应用专业毕业生求职信
2014/09/01 职场文书
2015年煤矿安全工作总结
2015/05/23 职场文书
餐厅服务员管理制度
2015/08/05 职场文书
学习心理学心得体会
2016/01/22 职场文书
2016党员干部政治学习心得体会
2016/01/23 职场文书
导游词之韩国济州岛
2019/10/28 职场文书
解决Golang中goroutine执行速度的问题
2021/05/02 Golang
Android Canvas绘制文字横纵向对齐
2022/06/05 Java/Android