跨页悬浮显示 @ 评论 (代码篇)

comment tip

@ 回复是个好东西, 因为它结构简单, 处理方便; 嵌套回复则有更友好的用户体验, 可以调动访客回复的积极性. 对 @ 回复而言, 悬浮显示 @ 评论 (显示评论提示框) 在一定程度上可以提升 @回复的用户体验. 但是当评论出现分页的时候, 评论提示框就像被阉割一样, 功能不全. 表现为不能获取其他页面的评论信息, 本文将告诉你如何跨页处理.

《跨页悬浮显示 @ 评论 (原理篇)》已经浅谈了跨页获取评论信息的原理, 本文将剖析其处理流程和提供相关代码.

在当前页面如何通过 @{username} 找到对应评论?

1. 每个评论都会有一个 ID, 结构如: comment-{commentId}, 这本是为了方便通过锚点找到评论, 同时也成为完成 @ 评论提示的必要条件.
2. 每个 @{username} 其实就是指向评论的锚点, 自然可以取得评论 ID.

所以其实很简单, 如果评论 ID 是 _commentId, 那么在 JS 可以通过以下代码找到对应的评论.

document.getElementById(_commentId);

如果能够找到目标评论, 则创建一个隐藏的临时评论, 并以目标评论作为其内容, 在 @{username} 附件将它显示出来; 如果没找到目标评论, 则通过 ID 到后台查找对应的评论, 进行跨页处理.

如何跨页加载评论?

跨页的实质是动态加载评论, 将获取的评论追加到评论列表最后, 让评论可以在本页中找到, 不同的只是这些评论通过 CSS 加工并不会显示出来.

可以参考下图. 如果评论不在本页, 会走红色路径, 在评论被加入当前页面之后, 会有一个动作, 将提示框的 Loading 信息替换为评论内容. 当用户在此将鼠标悬停在这个 @{username} 时, 评论已在当前页面, 所以不需再次加载, 而是走绿色路径, 直接将评论提示框调出.

at-reply-tip

注: 图中蓝色部分是后台处理, 黄色部分是整个加载过程的重点.

在后台中怎样获取评论并对其格式化?

这里可以自己写个方法对评论信息进行格式化, 也可以通过评论的回调方法 (WordPress 2.7 或以上版本可以定义评论的回调方法) 来获取格式化的 HTML.

$comment = get_comment($_GET['id']);
custom_comments($comment, null,null);

注: custom_comments 是我的回调函数的方法名.

JavaScript 代码

基于 jQuery 的 JS 代码, 如果不使用或者使用其他 JS frame, 请根据处理思路自行改造. 建议将代码放置于评论列表下方.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
var id=/^#comment-/;
var at=/^@/;
jQuery('#thecomments li p a').each(function() {
	if(jQuery(this).attr('href').match(id)&& jQuery(this).text().match(at)) {
		jQuery(this).addClass('atreply');
	}
});
jQuery('.atreply').hover(function() {
	var target = this;
	var _commentId = jQuery(this).attr('href');
 
	if(jQuery(_commentId).is('.comment')) {
		jQuery('<li class="comment tip"></li>').hide().html(jQuery(_commentId).html()).appendTo(jQuery('#thecomments'));
		jQuery('#thecomments .tip').css({
			left:jQuery().cumulativeOffset(this)[0] + jQuery(this).width() + 10,
			top:jQuery().cumulativeOffset(this)[1] - 22
		}).fadeIn();
	} else {
		var id = _commentId.slice(9);
		jQuery.ajax({
			type:         'GET'
			,url:         '?action=load_comment&id=' + id
			,cache:       false
			,dataType:    'html'
			,contentType: 'application/json; charset=utf-8'
 
			,beforeSend: function(){
				jQuery('<li class="comment tip"></li>').hide().html('<p class="ajax-loader msg">Loading...</p>').appendTo(jQuery('#thecomments'));
				jQuery('#thecomments .tip').css({
					left:jQuery().cumulativeOffset(target)[0] + jQuery(target).width() + 10,
					top:jQuery().cumulativeOffset(target)[1] - 22
				}).fadeIn();
			}
 
			,success: function(data){
				var addedComment = jQuery(data + '</li>');
				addedComment.hide().appendTo(jQuery('#thecomments'));
				jQuery('#thecomments .tip').html(addedComment.html());
			}
 
			,error: function(){
				jQuery('#thecomments .tip').html('<p class="msg">Oops, failed to load data.</p>');
			}
		});
	}
}, function() {
	jQuery('#thecomments .tip').fadeOut(400, function(){
		jQuery(this).remove();
	});
});

PHP 代码

这段代码来自 yinheli 的 PhilNa2 主题, 建议将代码追加到 function.php.

1
2
3
4
5
6
7
8
9
10
11
12
function load_comment(){
	if($_GET['action'] =='load_comment' && $_GET['id'] != ''){
		$comment = get_comment($_GET['id']);
		if(!$comment) {
			fail(printf('Whoops! Can\'t find the comment with id  %1$s', $_GET['id']));
		}
 
		custom_comments($comment, null,null);
		die();
	}
}
add_action('init', 'load_comment');

如果您使用以上代码进行了二次开发, 请不要转码和加密, 以保持代码开放可用.

声明: 本文采用 BY-NC-SA 协议进行授权. 转载请注明转自: 跨页悬浮显示 @ 评论 (代码篇)
  1. 越夜 | #51
    Jan 20th, 2010 at 13:51

    看起来头有点晕倒,反正用的你的主题,一会去找下你的回复插件... :grin: 这个表情工具好可爱 :cool:

Comment pages
1 2 990
  1. 砼砼's blog
    Dec 3rd, 2009 at 15:14

Twitter Email feed
RSS feed