完美實(shí)現(xiàn)仿QQ空間評(píng)論回復(fù)特效
評(píng)論回復(fù)是個(gè)很常見(jiàn)的東西,但是各大網(wǎng)站實(shí)現(xiàn)的方式卻不盡相同。大體上有兩種方式
1.

像優(yōu)酷這種最常見(jiàn),在輸入框中@要回復(fù)的人,這種方式下,用戶可以修改@。
新浪微博則是在這個(gè)基礎(chǔ)上,彈出好友菜單。這種方式的好處是不需要任何js,css處理兼容。

2.

像qq空間這種,對(duì)回復(fù)的人整個(gè)刪除。本屌感覺(jué)這種方式比較好,但這種方式有些兼容性上的細(xì)節(jié),這個(gè)后面會(huì)詳細(xì)說(shuō)明。
事實(shí)上,qq空間的這種實(shí)現(xiàn)在效果上是兼容了ie和現(xiàn)代瀏覽器的,做的非常好。上面是chrome
ie8

ie7

ie6就不上圖片了,太卡了,都懂得,最后本屌會(huì)附上最終例子的,當(dāng)然也兼容ie6。
下面就說(shuō)說(shuō)怎么實(shí)現(xiàn)的。
先看看qq空間是怎么做的
chrome

上面可以看到,qq空間是在button中加上文字,這樣在刪除的時(shí)候?qū)Ρ换貜?fù)的用戶名就能整個(gè)刪除了。
不過(guò)這樣做還不夠,首先是樣式,需要把button設(shè)置成inline-block,
消除button默認(rèn)的透明背景,邊框,當(dāng)然還有padding,margin設(shè)為0
這時(shí)在ie6,7中插入會(huì)發(fā)現(xiàn),似乎還存在padding,而且還很大


所以還需要加上overflow: visible;
另外屬性contenteditable設(shè)置成為false,否則光標(biāo)會(huì)跳到button里面,
然后在ie8下會(huì)發(fā)現(xiàn),輸入的時(shí)候如果有回車,然后在依次刪除的過(guò)程中,會(huì)發(fā)現(xiàn)button標(biāo)簽刪不掉,光標(biāo)會(huì)跑到button標(biāo)簽前面,而且再次按右光標(biāo)鍵或用鼠標(biāo)點(diǎn)擊button標(biāo)簽右邊都無(wú)法讓光標(biāo)跑到button標(biāo)簽右邊。事實(shí)上,qq空間在ie8中也有這個(gè)問(wèn)題
ie8

而在ie6,7下,就沒(méi)有這個(gè)問(wèn)題
ie7

ie6

這里針對(duì)ie8需要對(duì)文本框綁定keydown事件回調(diào)check_comment,對(duì)ie6,7綁定了也沒(méi)有問(wèn)題,這里就統(tǒng)一的對(duì)ie綁定。
function getPositionForTextArea(ctrl) { //獲取光標(biāo)位置
var CaretPos = 0;
if(document.selection) {
ctrl.focus();
var Sel = document.selection.createRange();
var Sel2 = Sel.duplicate();
Sel2.moveToElementText(ctrl);
var CaretPos = -1;
while(Sel2.inRange(Sel)){
Sel2.moveStart('character');
CaretPos++;
}
}else if(ctrl.selectionStart || ctrl.selectionStart == '0'){
CaretPos = ctrl.selectionStart;
}
return (CaretPos);
}
vm.check_comment=function(e,i){
var a=getPositionForTextArea($('reply'+i));
if(e.keyCode==8&&a<3){
var pat = new RegExp("^<p><button .*?>.*?</button> </p>$",'i');
if(pat.test(this.innerHTML))
this.innerHTML='';
}
};
光標(biāo)位置<3表明光標(biāo)前面就是button標(biāo)簽了,這時(shí)就可以清空輸入框了。注意這里為了嚴(yán)謹(jǐn),用正則表達(dá)式驗(yàn)證是不是button標(biāo)簽.
另外在正則表達(dá)式中button標(biāo)簽外包裹p標(biāo)簽,是因?yàn)閕e在按回車換行時(shí),會(huì)默認(rèn)自動(dòng)對(duì)前面的行包裹p標(biāo)簽。當(dāng)然,一開(kāi)始在輸入框也要在button標(biāo)簽外包裹p標(biāo)簽。

題外話
qq空間在ff上用的是img標(biāo)簽

之前一直以為qq空間在現(xiàn)代瀏覽器上統(tǒng)一用的是img標(biāo)簽,寫的時(shí)候才發(fā)現(xiàn)在chrome中用的是button標(biāo)簽,于是就在chrome下試了一下插入img標(biāo)簽,發(fā)現(xiàn)怎么也弄不掉邊框,而且刪除的時(shí)候,綁定中光標(biāo)位置的判斷也會(huì)和ie不一致,因?yàn)楝F(xiàn)代瀏覽器換行默認(rèn)插入<br>,于是索性對(duì)chrome也用button標(biāo)簽。
另外在我的例子中,ff中插入button標(biāo)簽的話,輸入框不容易獲得焦點(diǎn)。本屌也懶得去改了,仍然是在ff中插入img標(biāo)簽,對(duì)應(yīng)的keydown回調(diào)
if(!!-[1,]&&e.keyCode==8&&$('reply'+i).childNodes.length==2){//ff
this.innerHTML='';
return;
}
只用判斷輸入框的子節(jié)點(diǎn)個(gè)數(shù)就可以了。
最終效果
chrome

ff

ie8

ie7

ie6

附上例子下載
以上所述就是本文的全部?jī)?nèi)容了,希望大家能夠喜歡。
相關(guān)文章
WebStorm ES6 語(yǔ)法支持設(shè)置&babel使用及自動(dòng)編譯(詳解)
下面小編就為大家?guī)?lái)一篇WebStorm ES6 語(yǔ)法支持設(shè)置&babel使用及自動(dòng)編譯(詳解)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-09-09
分享9個(gè)最好用的JavaScript開(kāi)發(fā)工具和代碼編輯器
這篇文章主要介紹了9個(gè)最好用的JavaScript開(kāi)發(fā)工具和代碼編輯器,需要的朋友可以參考下2015-03-03
頁(yè)面實(shí)時(shí)更新時(shí)間的JS實(shí)例代碼
這篇文章主要介紹了頁(yè)面實(shí)時(shí)更新時(shí)間的JS實(shí)例代碼,有需要的朋友可以參考一下2013-12-12
解決循環(huán)中setTimeout執(zhí)行順序的問(wèn)題
今天小編就為大家分享一篇解決循環(huán)中setTimeout執(zhí)行順序的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-06-06
js實(shí)現(xiàn)按Ctrl+Enter發(fā)送效果
按Ctrl+Enter發(fā)送,思路是監(jiān)聽(tīng)textarea的onkeydown事件,當(dāng)ctrl鍵被按下,并且,keycode為13(回車),時(shí),調(diào)用發(fā)送表單的函數(shù)2014-09-09
JavaScript實(shí)現(xiàn)帶箭頭標(biāo)識(shí)的多級(jí)下拉菜單效果
這篇文章主要介紹了JavaScript實(shí)現(xiàn)帶箭頭標(biāo)識(shí)的多級(jí)下拉菜單效果,可實(shí)現(xiàn)橫向與縱向箭頭的形式標(biāo)識(shí)選中菜單項(xiàng)位置的功能,涉及javascript針對(duì)頁(yè)面元素位置的判定與樣式動(dòng)態(tài)操作技巧,需要的朋友可以參考下2015-08-08

