WordPress 搜索框添加文字提示 (续)

WordPress Searchbox Tip

搜索框文字提示并不难实现, 但是对用户来说肯定是个不错的提示. 之前我写了一个文章, 介绍使用 jQuery 实现 WordPress 搜索框添加文字提示, 没想到大家会对此感兴趣, 但是一些朋友对使用大量 JavaScript 实现该功能感到不解. 所以本文作为上一篇的延续, 以说清楚我为何要如此实现, 并详细的描述我的设计思路以及实现方法.

本文可能用到的一些术语, 这里简单说明一下, 以免混淆.
搜索框: 指输入搜索关键字的文本域.
搜索栏: 指包括搜索框和其他元素的一个提供搜索功能的区域.
提交按钮: 这里指搜索搜索栏里的提示信息的文字串.

为什么要写一大片的 JavaScript, 而不用那个简单的方法?

先说说一般的做法吧, 上一篇文章的评论中有朋友提供了一段处理代码 (评论第一页), 整理如下:

1
<input type="text" name="s" value="提示文字" onfocus="if (value =='提示文字'){value =''}" onblur="if (value ==''){value='提示文字'}" />

这样是可以实现搜索框的文字提示, 也是最多人使用的方法, 但是由于下面的两个理由, 我放弃了这个看似简单方便, 却是相当粗糙的方法.

1. 以上做法有很大的缺陷.
如果用户的浏览器禁止了或者不支持 JavaScript, 那么页面初始化时依然在搜索框显示 "提示文字". 当鼠标聚焦到搜索框时, 文字并不会消除, 而是变成了默认的搜索内容, 此时用户或许会无奈地点 Backspace 消掉文字重新输入, 或许就不搜了, 找 Google 去.

为搜索框添加提示信息, 意在给予用户更多的引导, 以提高用户体验, 若为了实现功能而顾此失彼实在很不应该.

2. 在搜索页面的搜索框里显示本次搜索关键字.
在 Google 和百度搜索一些关键字之后, 跳转到搜索结果页面, 你会发现之前搜索的内容会保留在搜索框里. 对于用户来说, 这是很方便的. 为此, 我们可以用以下代码在 WordPress 中生成搜索输入框, 在搜索页面的搜索框显示本次搜索的关键字.

1
<input type="text" name="s" value="<?php echo wp_specialchars($s, 1); ?>" />

如果这里我们使用 JavaScript 添加搜索提示, 可以先判断搜索框里是否有内容, 如果没有内容才添加搜索提示. 示意代码如下:

1
2
3
if(searchtxt.value == "") {
	searchtxt.value = "提示文字";
}

如何使用 JavaScript 实现搜索栏文字提示?

上一篇文章中, 我给出了 jQuery 的实现代码, 但 jQuery 糟糕的代码结构很难将思路说清楚 (本人认为 jQuery 风格的代码容易编写但难以维护). 这不, 我又敲了一段 JavaScript...

1. 实现基本的搜索框文字提示功能.
从简单开始, 先做一个没有提交按钮的搜索栏吧.

1
2
3
4
5
<form action="<?php bloginfo('home'); ?>" method="get">
	<div>
		<input type="text" id="searchtxt" name="s" value="<?php echo wp_specialchars($s, 1); ?>" />
	</div>
</form>

请留意上方代码的 input 元素外层的 div 层, 没有它的话代码无法通过 W3C 认证.
接着, 我们要在页面初始化时搜索框失去焦点时显示提示文字, 鼠标聚焦搜索框时消除文字提示.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
// 搜索框
var searchtxt = document.getElementById("searchtxt");
// 提示文字
var tiptext = "提示文字...";
// 页面初始化时
if(searchtxt.value == "") {
	searchtxt.value = tiptext;
}
// 鼠标聚焦搜索框时
searchtxt.onfocus = function(e) {
	if(searchtxt.value == tiptext) {
		searchtxt.value = "";
	}
}
// 搜索框失去焦点时
searchtxt.onblur = function(e) {
	if(searchtxt.value == "") {
		searchtxt.value = tiptext;
	}
}

以上代码实现了最基本的功能, 你可以将这段代码放置在搜索栏代码下方, 因为这样可以在搜索栏加载完成的时候立即执行代码显示提示信息.

2. 让显示的提示文字不那么明显, 以区分开提示信息和搜索关键字.
让文字显示不那么明显很简单, 就是改改字体颜色嘛, 黑底的就将文字改暗一点, 白低的就改亮一些. 我们需要一小段 CSS, 你可以将它加到 style.css 中.

1
2
3
.searchtip {
	color:#999;
}

接着我们还要改一下 JavaScript, 当显示提示文字的时候, 让搜索框应用以上 CSS 代码, 否则取消这个样式.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
// 搜索框
var searchtxt = document.getElementById("searchtxt");
// 提示文字
var tiptext = "提示文字...";
// 页面初始化时
if(searchtxt.value == "" || searchtxt.value == tiptext) { // 初始化时, 就算显示内容就是提示文字也要进行处理, 以应用提示文字不一样的风格.
	searchtxt.className = "searchtip"; // 先改变风格
	searchtxt.value = tiptext; // 后改变内容
}
// 鼠标聚焦搜索框时
searchtxt.onfocus = function(e) {
	if(searchtxt.value == tiptext) {
		searchtxt.value = ""; // 先改变内容
		searchtxt.className = ""; // 后改变风格
	}
}
// 搜索框失去焦点时
searchtxt.onblur = function(e) {
	if(searchtxt.value == "") {
		searchtxt.className = "searchtip"; // 先改变风格
		searchtxt.value = tiptext; // 后改变内容
	}
}

从上方代码可以看出, 这里是通过修改 class 属性来控制颜色的, 但你也可以用其他方法, 如直接在 JavaScript 中修改样式 (不推荐). 但是你必须注意改变风格和更改搜索框内容的顺序. 至于为什么要如此关注处理顺序, 就当课后试题自己想想吧.

不知道你是否已经注意到, 页面初始化时的处理条件改变了, 为什么呢? 因为刷新页面的时候, 文本域和文本区都会保留刷新前的数据. 如果不这么处理, 在刷新页面后, 提示文字的样式风格就应用不了了.

3. 为搜索栏添加提交按钮
添加了新的元素, 就得修改一下页面代码了.

1
2
3
4
5
6
<form action="<?php bloginfo('home'); ?>" method="get">
	<div>
		<input type="text" id="searchtxt" name="s" value="<?php echo wp_specialchars($s, 1); ?>" />
		<input type="submit" id="searchbtn" value="" />
	</div>
</form>

考虑到提示文字也是搜索框的内容, 如果点了搜索按钮对它进行了搜索会相当的尴尬, 所以我们需要添加一小段 JavaScript 代码, 禁止在搜索框为空或显示提示信息的时候点击提交按钮进行搜索处理.

1
2
3
4
5
6
7
8
// 提交按钮
var searchbtn = document.getElementById("searchbtn");
// 禁止在搜索框为空或显示提示信息时提交表单
searchbtn.onclick = function(e) {
	if(searchtxt.value == "" || searchtxt.value == tiptext) {
		return false;
	}
}

总结

搜索框的文字提示是可有可无的功能, 它根本不能成为网站中十分有用的功能, 反而会增加网页的负担. 但为了提高用户体验, 或者在一定程度上吓唬菜鸟, 很有必要在搜索框加上这个小提示. 搜易我们必须要保证原来的功能不受影响的前提下进行处理, 不到万不得已时就别让页面依赖 JavaScript.

例如: 我想点击 TOP 按钮滑动到页面顶部, 我会写成:

1
<a href="#" onclick="goTop();return false;">TOP</a>

而不是

1
<a href="javascript:goTop();">TOP</a>

因为前者在浏览器不支持 JavaScript 的时候依然可以跳转到页面顶部, 只是不会滑动而已; 但后者会变得完全没有效果.

没想到写了这么长的一个文章, 我觉得问题应该说清楚了, 如果你还是一头雾水也不要担心, 请可以下载我最新发布的 Elegant Box 4.0 主题看看我在它上面是怎么实现的.

声明: 本文采用 BY-NC-SA 协议进行授权. 转载请注明转自: WordPress 搜索框添加文字提示 (续)
  1. kramon | #1
    2009-05-09 01:16

    MG12出帖,必属精品!

  2. feicun | #2
    2009-05-09 01:21

    没沙发了,这个功能确实可有可无……不过马格12写这么长的文章要支持啊,啊啊啊啊 :grin:

  3. Maxter | #3
    2009-05-09 01:48

    :cry: english

  4. 石头 | #4
    2009-05-09 02:48

    受教了

  5. ottmsaso | #5
    2009-05-09 05:01

    English plz :cry:

  6. patrick | #6
    2009-05-09 09:04

    好文章,定一个!已经用上 :grin:

  7. Sentimental | #7
    2009-05-09 11:13

    文章好长的,学习了,有空做个试试

  8. zwwooooo | #8
    2009-05-09 12:55

    呵呵,好文章,抽空加到主题去

  9. bolo | #9
    2009-05-09 13:20

    学习了,想不到心思还真慎密!佩服

  10. 8suo | #10
    2009-05-09 15:23

    好复杂啊

  11. Xiaoding | #11
    2009-05-09 16:09

    学习了~~! 使用中! :cool:

  12. Jutoy | #12
    2009-05-09 19:40

    嗯,受教了。考虑得很周到的说…

  13. 拆組達人 | #13
    2009-05-09 19:57

    (筆記)
    有空時來試試看!^^

  14. zwws | #14
    2009-05-09 21:07

    大哥,敲文章我看还是老老实实用中文标点符号,我看你一个半角逗号 + 空格很累的……
    :mrgreen:

  15. HK | #15
    2009-05-09 21:29

    过来学习了,呵呵 :razz:

  16. mg12 | #16
    2009-05-09 21:47

    @ottmsaso
    Don't worry, I will add this feature to new version of the themes that I released.

    @Sentimental
    长不好吗? 以后这么长的, 我就拆成三篇得了, 隔两天发布一篇. 难怪我现在发的文章少了, 回头看看, 文章都比以前的长, 这下亏大了.

    @bolo
    程序员必须小心谨慎, 毫不逊色于古代女子的针线功夫.

    @zwws
    (=. =) 你的头像... 我习惯用半角标点了, 读书时靠这个骗字数.

  17. Maxter | #17
    2009-05-09 22:49

    :cry: english, jaja xD =( i don't speek chineses

  18. justdoitrocky | #18
    2009-05-10 03:25

    我下了这个模板试了下,很漂亮啊。 但发现加载是 左边加载完了才加载右边, 这样每次打开右边都是空空的, 过点时间左边加载完了,右边才显示。 如果网速慢一点的话显示效果不是很好呀。

    不知道能不能计设成从上加载到下的,呵呵,建议而以。

  19. justdoitrocky | #19
    2009-05-10 03:27

    看上面,我的用户名有点长,遮住了哦。

  20. justdoitrocky | #20
    2009-05-10 03:29

    justdoitrocky :我下了这个模板试了下,很漂亮啊。 但发现加载是 左边加载完了才加载右边, 这样每次打开右边都是空空的, 过点时间左边加载完了,右边才显示。 如果网速慢一点的话显示效果不是很好呀。
    不知道能不能计设成从上加载到下的,呵呵,建议而以。

    左边比如说有10张 50k 的图片的时候,呵呵,就有必要啦。

  21. 基本没普 | #21
    2009-05-10 12:48

    有点晕

  22. joel | #22
    2009-05-10 13:08

    还是喜欢jq的

  23. ucax | #23
    2009-05-10 14:06

    需要有程度才看的懂~~ 。 inove 目前我還是試不出來 :roll:

  24. alluse | #24
    2009-05-10 17:46

    我可以评论么?

  25. huahua | #25
    2009-05-10 18:25

    mg12的东西,永远学不完啊。

  26. mg12 | #26
    2009-05-10 18:28

    @justdoitrocky
    你可以用 AJAX 加载页面.

    @ucax
    (- -!) 那你下载个 ElegantBox 参考一下吧.

    @alluse
    为什么不可以?

  27. 石头 | #27
    2009-05-10 20:59

    您好,我用的是你的主题。我想请教你怎么修改能够让打开一篇文章的时候,标题栏显示的是先文章名,后博客名。而现在默认的都是打开任何一篇文章先博客名,后文章名。谢谢了。

  28. mg12 | #28
    2009-05-10 23:30

    在 templates/header.php 你可以找到 the_title() 函数, 应该就是改这个, 具体请 Google 一下吧.

  29. 保健品包装设计 | #29
    2009-05-11 10:39

    确实有帮助,谢谢了

  30. LAONB | #30
    2009-05-11 16:47

    搜索提示没问题,搜索位置有问题,我已经将这个东东换了个合适的位置,早就该换,头部可以更发达,哈哈。
    我更希望你能够帮助我把代码加到最顶端(一直都加不上去)。

  31. elyO²m | #31
    2009-05-11 20:29

    I hope you'll find the time to translate this post to your new english website NeoEase.org. Thanks for your work.

  32. shine | #32
    2009-05-12 10:36

    写的,太精辟了,哈

  33. mg12 | #33
    2009-05-12 20:55

    @LAONB
    我明白你的意思, 以后的主题会在这方面考虑的. 不过这个就不改了.

    @elyO²m
    I will, but the first thing is create an new theme for the new site. :)

    @shine
    :smile:

  34. LAONB | #34
    2009-05-12 22:46

    @mg12
    呵呵,我通过修改CSS,已经把搜索框抬到头上了,现在看着帅气多了。

  35. 魏風 | #35
    2009-05-13 17:45

    :cool: 好樣的!
    幫助我好多!謝了

  36. zhchsf | #36
    2009-05-15 20:41

    还是直接用你做好的现成主题吧

  37. | #37
    2009-05-18 16:46

    像老大看齐,国人的骄傲!

  38. shine | #38
    2009-05-20 20:23

    你好mg12,请问,我设置好了LINKS页面
    但是我想像你这样,http://www.neoease.com/links/
    链接分类名称排列的,要如何设置?
    my blog http://fudh.cn

  39. pizn | #39
    2010-08-20 18:13

    师兄,今天在学习这个功能,我发现了您代码中有一个问题哦.
    第一句获取的id赋予新的变量名称和后面使用的不同,所以在调用的时候调用不到,我改为这样就可以了:
    “var searchtxt = document.getElementById("searchtxt");”

  40. mg12 | #40
    2010-08-20 19:10

    @pizn
    已经改正过来了, 谢谢.

  1. No trackbacks yet.

Twitter Email feed
RSS feed