谷歌音乐搜索栏的提示功能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中路径问题的解决方案
Oct 09 PHP
快速配置PHPMyAdmin方法
Jun 05 PHP
php下通过curl抓取yahoo boss 搜索结果的实现代码
Jun 10 PHP
初学PHP的朋友 经常问的一些问题。不断更新
Aug 11 PHP
thinkphp中连接oracle时封装方法无法用的解决办法
Jun 17 PHP
ThinkPHP之R方法实例详解
Jun 20 PHP
PHP采用get获取url汉字出现乱码的解决方法
Nov 13 PHP
php结合正则批量抓取网页中邮箱地址
May 19 PHP
PHP自动生成表单代码分享
Jun 19 PHP
PHP实现清除wordpress里恶意代码
Oct 21 PHP
PHP多进程编程总结(推荐)
Jul 18 PHP
Yii2中关联查询简单用法示例
Aug 10 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初学者头疼问题总结
2006/10/09 PHP
JavaScript创建命名空间的5种写法
2014/06/24 PHP
IIS下PHP的三种配置方式对比
2014/11/20 PHP
Yii中表单用法实例详解
2016/01/05 PHP
PHP7扩展开发教程之Hello World实现方法示例
2017/08/03 PHP
php插入mysql数据返回id的方法
2018/05/31 PHP
浅析JQuery中的html(),text(),val()区别
2014/09/01 Javascript
Javascript函数式编程简单介绍
2015/10/11 Javascript
js判断日期时间有效性的方法
2015/10/24 Javascript
第三篇Bootstrap网格基础
2016/06/21 Javascript
Javascript typeof与instanceof的区别
2016/10/18 Javascript
微信小程序中的onLoad详解及简单实例
2017/04/05 Javascript
JavaScript时间戳与时间日期间相互转换
2017/12/11 Javascript
JavaScript this绑定过程深入详解
2018/12/07 Javascript
详解vue几种主动刷新的方法总结
2019/02/19 Javascript
解决layui中onchange失效以及form动态渲染失效的问题
2019/09/27 Javascript
JavaScript使用百度ECharts插件绘制饼图操作示例
2019/11/26 Javascript
JavaScript eval()函数定义及使用方法详解
2020/07/07 Javascript
[56:47]Ti4 循环赛第三日 iG vs Liquid
2014/07/12 DOTA
小白入门篇使用Python搭建点击率预估模型
2018/10/12 Python
从运行效率与开发效率比较Python和C++
2018/12/14 Python
快速解决docker-py api版本不兼容的问题
2019/08/30 Python
python将logging模块封装成单独模块并实现动态切换Level方式
2020/05/12 Python
Python pickle模块常用方法代码实例
2020/10/10 Python
python中翻译功能translate模块实现方法
2020/12/17 Python
CSS3弹性盒模型flex box快速入门心得(必看篇)
2016/05/24 HTML / CSS
html5指南-4.使用Geolocation实现定位功能
2013/01/07 HTML / CSS
德国家用电器购物网站:Premiumshop24
2019/08/22 全球购物
实习老师个人总结的自我评价
2013/09/28 职场文书
医学检验专业大学生求职信
2013/11/18 职场文书
会计专业职业规划:规划自我赢取未来
2014/02/12 职场文书
酒店节能降耗方案
2014/05/08 职场文书
2014法制宣传日活动总结
2014/07/09 职场文书
庆七一活动总结
2014/08/27 职场文书
员工开除通知书
2015/04/25 职场文书
python实战之一步一步教你绘制小猪佩奇
2021/04/22 Python