利用jQuery實(shí)現(xiàn)WordPress中@的ID懸浮顯示評(píng)論內(nèi)容
比如: A 留言了, B 用 @ 回復(fù)了 A, 所以 B 的回復(fù)可能是這樣的:
@A
How much money do you have?
就是說(shuō), 當(dāng)鼠標(biāo)懸停在 @A 上面的時(shí)候, 就會(huì)將 A 的評(píng)論內(nèi)容顯示在一個(gè)懸浮區(qū)域中.
實(shí)現(xiàn)步驟
在這里我們將以iNove主題為例進(jìn)行講解。
1. 將以下代碼保存為commenttips.js:
jQuery(document).ready( function(){ 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() { jQuery(jQuery(this).attr('href')).clone().hide().insertAfter(jQuery(this).parents('li')).attr('id','').addClass('tip').fadeIn(200); }, function() { jQuery('.tip').fadeOut(400, function(){jQuery(this).remove();}); } ); jQuery('.atreply').mousemove( function(e) { jQuery('.tip').css({left:(e.clientX+18),top:(e.pageY+18)}) } ); } )
2. 將 commenttips.js 文件放置到 inove/js 目錄.
3. style.css 中追加樣式代碼如下:
#thecomments .tip { background:#FFF; border:1px solid #CCC; width:605px; padding:10px !important; padding:10px 10px 0; margin-top:0; position:absolute; z-index:3; } #thecomments .tip .act { display:none; } *+html #thecomments .tip { padding:10px 10px 0 !important; }
4. 在主題中添加代碼調(diào)用 JavaScript. 打開(kāi) templates/end.php, 在 </body> 前面一行添加以下代碼:
(如果你有其他插件或者自己已經(jīng)添加了 jQuery 的庫(kù), 那第一行代碼可以不必添加.)
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.1/jquery.min.js"></script>
<script type="text/javascript" src="<?php bloginfo('template_url'); ?>/js/commenttips.js"></script>
5. 好了, 刷新一下有 @ 回復(fù)的頁(yè)面, 等頁(yè)面加載完, 將鼠標(biāo)懸停在 @ 回復(fù)上, 你會(huì)看到效果的.
為什么不能跨頁(yè)顯示?
因?yàn)槠涔ぷ髟硎? 當(dāng)鼠標(biāo)移動(dòng)到 @{username} 時(shí)在本頁(yè)找到對(duì)應(yīng)的評(píng)論, 并插入到評(píng)論列表中, 以絕對(duì)位置的方式顯示出來(lái). 如果評(píng)論不在本頁(yè), 找不到對(duì)象, 當(dāng)然就沒(méi)有后面的處理了.
如何跨頁(yè)獲取評(píng)論信息?
如果本頁(yè)找不到對(duì)應(yīng)的評(píng)論, 可以通過(guò)評(píng)論的 ID, 用 AJAX 將后臺(tái)查詢(xún)到的評(píng)論信息返回頁(yè)面. 當(dāng)鼠標(biāo)移動(dòng)到 @ 評(píng)論上時(shí), 向用戶(hù)懸浮顯示 'Loading...' 提示框, 如果操作成功將找到的評(píng)論插入評(píng)論列表的最后面, 并將該評(píng)論的內(nèi)容置換到 'Loading...' 框.
也就是說(shuō), 被加載過(guò)的評(píng)論會(huì)一直保留在本頁(yè)中, 當(dāng)鼠標(biāo)再次移動(dòng)到 @ 評(píng)論上不用重新加載.
下面我們來(lái)看一下針對(duì)跨頁(yè)評(píng)論的處理方法:
在當(dāng)前頁(yè)面如何通過(guò) @{username} 找到對(duì)應(yīng)評(píng)論?
1. 每個(gè)評(píng)論都會(huì)有一個(gè) ID, 結(jié)構(gòu)如: comment-{commentId}, 這本是為了方便通過(guò)錨點(diǎn)找到評(píng)論, 同時(shí)也成為完成 @ 評(píng)論提示的必要條件.
2. 每個(gè) @{username} 其實(shí)就是指向評(píng)論的錨點(diǎn), 自然可以取得評(píng)論 ID.
所以其實(shí)很簡(jiǎn)單, 如果評(píng)論 ID 是 _commentId, 那么在 JS 可以通過(guò)以下代碼找到對(duì)應(yīng)的評(píng)論.
document.getElementById(_commentId);
如果能夠找到目標(biāo)評(píng)論, 則創(chuàng)建一個(gè)隱藏的臨時(shí)評(píng)論, 并以目標(biāo)評(píng)論作為其內(nèi)容, 在 @{username} 附件將它顯示出來(lái); 如果沒(méi)找到目標(biāo)評(píng)論, 則通過(guò) ID 到后臺(tái)查找對(duì)應(yīng)的評(píng)論, 進(jìn)行跨頁(yè)處理.
如何跨頁(yè)加載評(píng)論?
跨頁(yè)的實(shí)質(zhì)是動(dòng)態(tài)加載評(píng)論, 將獲取的評(píng)論追加到評(píng)論列表最后, 讓評(píng)論可以在本頁(yè)中找到, 不同的只是這些評(píng)論通過(guò) CSS 加工并不會(huì)顯示出來(lái).
可以參考下圖. 如果評(píng)論不在本頁(yè), 會(huì)走紅色路徑, 在評(píng)論被加入當(dāng)前頁(yè)面之后, 會(huì)有一個(gè)動(dòng)作, 將提示框的 Loading 信息替換為評(píng)論內(nèi)容. 當(dāng)用戶(hù)在此將鼠標(biāo)懸停在這個(gè) @{username} 時(shí), 評(píng)論已在當(dāng)前頁(yè)面, 所以不需再次加載, 而是走綠色路徑, 直接將評(píng)論提示框調(diào)出.
注: 圖中藍(lán)色部分是后臺(tái)處理, 黃色部分是整個(gè)加載過(guò)程的重點(diǎn).
在后臺(tái)中怎樣獲取評(píng)論并對(duì)其格式化?
這里可以自己寫(xiě)個(gè)方法對(duì)評(píng)論信息進(jìn)行格式化, 也可以通過(guò)評(píng)論的回調(diào)方法 (WordPress 2.7 或以上版本可以定義評(píng)論的回調(diào)方法) 來(lái)獲取格式化的 HTML.
$comment = get_comment($_GET['id']); custom_comments($comment, null,null);
注: custom_comments 是我的回調(diào)函數(shù)的方法名.
JavaScript 代碼
基于 jQuery 的 JS 代碼, 如果不使用或者使用其他 JS frame, 請(qǐng)根據(jù)處理思路自行改造. 建議將代碼放置于評(píng)論列表下方.
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 代碼
這段代碼來(lái)自PhilNa2 主題, 建議將代碼追加到 function.php.
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');
- 基于jquery實(shí)現(xiàn)ajax無(wú)刷新評(píng)論
- C#使用jQuery實(shí)現(xiàn)無(wú)刷新評(píng)論提交的方法
- Asp.net利用JQuery AJAX實(shí)現(xiàn)無(wú)刷新評(píng)論思路與代碼
- jquery 新浪網(wǎng)易的評(píng)論塊制作
- jquery實(shí)現(xiàn)仿新浪微博評(píng)論滾動(dòng)效果
- JQuery實(shí)現(xiàn)動(dòng)態(tài)添加刪除評(píng)論的方法
- PHP結(jié)合jQuery實(shí)現(xiàn)的評(píng)論頂、踩功能
- jQuery 實(shí)現(xiàn)評(píng)論等級(jí)好評(píng)差評(píng)特效
- jQuery實(shí)現(xiàn)頁(yè)面評(píng)論欄中訪客信息自動(dòng)填寫(xiě)功能的方法
- jQuery實(shí)現(xiàn)的簡(jiǎn)單無(wú)刷新評(píng)論功能示例
相關(guān)文章
EasyUI 數(shù)據(jù)表格datagrid列自適應(yīng)內(nèi)容寬度的實(shí)現(xiàn)
這篇文章主要介紹了EasyUI 數(shù)據(jù)表格datagrid列自適應(yīng)內(nèi)容寬度的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-07-07jQuery中slideUp 和 slideDown 的點(diǎn)擊事件
這篇文章主要介紹了jQuery中slideUp 和 slideDown 的點(diǎn)擊事件的相關(guān)資料,需要的朋友可以參考下2015-02-02jQuery簡(jiǎn)單創(chuàng)建節(jié)點(diǎn)的方法
這篇文章主要介紹了jQuery簡(jiǎn)單創(chuàng)建節(jié)點(diǎn)的方法,涉及jQuery獲取節(jié)點(diǎn)及append添加元素創(chuàng)建節(jié)點(diǎn)的相關(guān)技巧,需要的朋友可以參考下2016-09-09淺談jQuery綁定事件會(huì)疊加的解決方法和心得總結(jié)
下面小編就為大家?guī)?lái)一篇淺談jQuery綁定事件會(huì)疊加的解決方法和心得總結(jié)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-10-10JQuery制作的放大效果的popup對(duì)話框(未添加任何jquery plugin)分享
分享一個(gè)JQuery制作的放大效果的popup對(duì)話框(未添加任何jquery plugin)項(xiàng)目中可以根據(jù)自己的需求來(lái)寫(xiě)css,感興趣的朋友可以了解下哈2013-04-04Jquery實(shí)現(xiàn)控件的隱藏和顯示實(shí)例
本篇文章主要是對(duì)Jquery實(shí)現(xiàn)控件的隱藏和顯示實(shí)例進(jìn)行了介紹,需要的朋友可以過(guò)來(lái)參考下,希望對(duì)大家有所幫助2014-02-02jQuery中extend函數(shù)的實(shí)現(xiàn)原理詳解
這篇文章主要介紹了jQuery中extend函數(shù)的實(shí)現(xiàn)原理詳解,extend()函數(shù)用于jQuery插件的開(kāi)發(fā),本文主要分析它的實(shí)現(xiàn)原理,需要的朋友可以參考下2015-02-02jquery轉(zhuǎn)盤(pán)抽獎(jiǎng)功能實(shí)現(xiàn)
這篇文章主要介紹了jquery轉(zhuǎn)盤(pán)抽獎(jiǎng)功能實(shí)現(xiàn),實(shí)現(xiàn)的效果是九宮格大轉(zhuǎn)盤(pán)抽獎(jiǎng),應(yīng)用特別廣泛的轉(zhuǎn)盤(pán)抽獎(jiǎng)方式,感興趣的小伙伴們可以參考一下2015-11-11