jQuery彈出下拉列表插件(實(shí)現(xiàn)kindeditor的@功能)
這幾天有個(gè)工作需求,就是在富文本輸入?yún)^(qū)域(kindeditor)可以有@功能,能夠容易提示用戶(hù)名的(像在qq群組@人一樣)。在網(wǎng)上找了一個(gè)叫bootstrap-suggest的插件,卻不能滿(mǎn)足我的需求,于是我決定在該插件上改良,主要是下面幾點(diǎn):
1. @內(nèi)容的輸入,能夠匹配多個(gè)屬性值。
2. 選中列表值后,是成塊插入kindeditor的(方便刪除,也利于區(qū)分文本)。
3. 修正輸入偶數(shù)關(guān)鍵字@功能失效問(wèn)題。
前言
在一開(kāi)始,我用bootstrap-suggest(https://github.com/lodev09/bootstrap-suggest),這個(gè)插件能夠?qū)崿F(xiàn)以下效果。

但是我發(fā)覺(jué)有幾個(gè)問(wèn)題:
1. 只能單一匹配(可能存在需要匹配拼音或中文)。
2. 偶數(shù)位的@功能會(huì)失效。
3. 選取值后,只是簡(jiǎn)單文本(沒(méi)有qq一樣那種成塊效果)。
jquery-kindeditor-suggest
由于我不想重復(fù)造輪子,于是決定在上面插件做調(diào)整,以滿(mǎn)足我的需求,有幾個(gè)關(guān)鍵地方需說(shuō)明。
1. startOffset取值錯(cuò)誤問(wèn)題。
如果使用了KindEditor的insertHTML,會(huì)導(dǎo)致下一次startOffset取值出錯(cuò)。原插件在獲取光標(biāo)位置(top,left)時(shí),會(huì)需要插入一個(gè)span去獲取,在獲取完后刪除,但是這時(shí)候下一次editor.cmd.range.startOffset;就出錯(cuò)。
于是我修改了插入的方式:
var doc = editor.cmd.range.doc,
range = editor.cmd.range,
frag = doc.createDocumentFragment();
KindEditor('@<span id="input-textarea-caret-position-mirror-span">.</span>' , doc).each(function() {
frag.appendChild(this);
});
range.deleteContents();
range.insertNode(frag);
range.collapse(false);
PS:在170行。
2. 替換選擇值
將@后面的輸入內(nèi)容刪除(包含@),然后插入一個(gè)完整的標(biāo)簽(選擇值),還要保證光標(biāo)位置正確。
var dType = !!el.cmd.range.startContainer.data ? "data" : "innerHTML"; //這個(gè)取值最關(guān)鍵
var sVal = el.cmd.range.startContainer[dType];
var lAt = sVal.lastIndexOf(this.key);
el.cmd.range.startContainer[dType] = sVal.substring(0, lAt) ;
el.insertHtml("<span contenteditable='false'>"+this.key+item.value+' </span>' +'<span id="input-textarea-caret-position-mirror-span">.</span>');
var span = el.edit.doc
.getElementById('input-textarea-caret-position-mirror-span');
var range = el.edit.doc.createRange();
range.selectNodeContents(span);
range.collapse(false);
var sel = el.edit.win.getSelection();
sel.removeAllRanges();
sel.addRange(range); //hack:修正下一次startOffset
span.parentNode.removeChild(span);
PS:在442行。
修改后效果
內(nèi)容是富文本輸入?yún)^(qū)域,插入的成塊文本。

總結(jié)
雖然是基于他人的插件,但我在修復(fù)問(wèn)題上也花費(fèi)了很多心思,之前一直發(fā)現(xiàn)沒(méi)有精確針對(duì)kindeditord @功能的插件,所以我就自己弄了下。
我把源代碼放在Github上了,有需要的可去下:https://github.com/codingforme/jquery-kindeditor-suggest
以上所述是小編給大家介紹的jQuery彈出下拉列表插件(實(shí)現(xiàn)kindeditor的@功能),希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
- Angularjs編寫(xiě)KindEditor,UEidtor,jQuery指令
- jQuery讀取和設(shè)定KindEditor值的方法
- jQuery編輯器KindEditor4.1.4代碼高亮顯示設(shè)置教程
- jQuery三級(jí)下拉列表導(dǎo)航菜單代碼分享
- jquery用ajax方式從后臺(tái)獲取json數(shù)據(jù)后如何將內(nèi)容填充到下拉列表
- jQuery插件datalist實(shí)現(xiàn)很好看的input下拉列表
- jQuery實(shí)現(xiàn)自定義下拉列表
- JQuery 使用attr方法實(shí)現(xiàn)下拉列表選中
- jquery自定義下拉列表示例
- JQuery實(shí)現(xiàn)鼠標(biāo)滑過(guò)顯示導(dǎo)航下拉列表
相關(guān)文章
高效Web開(kāi)發(fā)的10個(gè)jQuery代碼片段
這篇文章主要為大家詳細(xì)介紹了高效Web開(kāi)發(fā)的10個(gè)jQuery代碼片段,具有一定的實(shí)用性和參考價(jià)值,感興趣的小伙伴們可以參考一下2016-07-07
jQuery結(jié)合PHP+MySQL實(shí)現(xiàn)二級(jí)聯(lián)動(dòng)下拉列表[實(shí)例]
二級(jí)聯(lián)動(dòng)的實(shí)現(xiàn)方法還真不少,實(shí)用性也很強(qiáng),這里結(jié)合一個(gè)學(xué)生信息表的實(shí)例,來(lái)分享一下我的實(shí)現(xiàn)過(guò)程2011-11-11
使用jQuery動(dòng)態(tài)加載js腳本文件的方法
動(dòng)態(tài)加載Javascript是一項(xiàng)非常強(qiáng)大且有用的技術(shù)。這方面的主題在網(wǎng)上已經(jīng)討論了不少,我也經(jīng)常會(huì)在一些個(gè)人項(xiàng)目上使用RequireJS和Dojo加載js2014-04-04
js jquery驗(yàn)證銀行卡號(hào)信息正則學(xué)習(xí)
銀行卡號(hào)格式驗(yàn)證如何錯(cuò)誤將提示:格式錯(cuò)誤,應(yīng)該是19位數(shù)字,利用正則實(shí)現(xiàn),感興趣的朋友可以了解下,希望本文對(duì)你學(xué)習(xí)正則有所幫助2013-01-01
jQuery實(shí)現(xiàn)的右下角廣告窗體跟隨效果示例
這篇文章主要介紹了jQuery實(shí)現(xiàn)的右下角廣告窗體跟隨效果,涉及jQuery結(jié)合時(shí)間函數(shù)動(dòng)態(tài)操作頁(yè)面元素屬性的相關(guān)技巧,需要的朋友可以參考下2016-09-09
jquery的attr方法禁用表單元素禁用輸入內(nèi)容
這篇文章主要介紹了通過(guò)jquery的attr方法來(lái)禁用表單元素禁輸入內(nèi)容,示例如下,需要的朋友可以參考參考2014-06-06

