jQuery彈出下拉列表插件(實(shí)現(xiàn)kindeditor的@功能)
這幾天有個(gè)工作需求,就是在富文本輸入?yún)^(qū)域(kindeditor)可以有@功能,能夠容易提示用戶名的(像在qq群組@人一樣)。在網(wǎng)上找了一個(gè)叫bootstrap-suggest的插件,卻不能滿足我的需求,于是我決定在該插件上改良,主要是下面幾點(diǎn):
1. @內(nèi)容的輸入,能夠匹配多個(gè)屬性值。
2. 選中列表值后,是成塊插入kindeditor的(方便刪除,也利于區(qū)分文本)。
3. 修正輸入偶數(shù)關(guān)鍵字@功能失效問題。
前言
在一開始,我用bootstrap-suggest(https://github.com/lodev09/bootstrap-suggest),這個(gè)插件能夠?qū)崿F(xiàn)以下效果。
但是我發(fā)覺有幾個(gè)問題:
1. 只能單一匹配(可能存在需要匹配拼音或中文)。
2. 偶數(shù)位的@功能會(huì)失效。
3. 選取值后,只是簡單文本(沒有qq一樣那種成塊效果)。
jquery-kindeditor-suggest
由于我不想重復(fù)造輪子,于是決定在上面插件做調(diào)整,以滿足我的需求,有幾個(gè)關(guān)鍵地方需說明。
1. startOffset取值錯(cuò)誤問題。
如果使用了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ù)問題上也花費(fèi)了很多心思,之前一直發(fā)現(xiàn)沒有精確針對kindeditord @功能的插件,所以我就自己弄了下。
我把源代碼放在Github上了,有需要的可去下:https://github.com/codingforme/jquery-kindeditor-suggest
以上所述是小編給大家介紹的jQuery彈出下拉列表插件(實(shí)現(xiàn)kindeditor的@功能),希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
- Angularjs編寫KindEditor,UEidtor,jQuery指令
- jQuery讀取和設(shè)定KindEditor值的方法
- jQuery編輯器KindEditor4.1.4代碼高亮顯示設(shè)置教程
- jQuery三級下拉列表導(dǎo)航菜單代碼分享
- jquery用ajax方式從后臺獲取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)滑過顯示導(dǎo)航下拉列表
相關(guān)文章
前端分頁功能的實(shí)現(xiàn)以及原理(jQuery)
本文主要介紹了基于jQuery實(shí)現(xiàn)的前端分頁功能,并分析了其實(shí)現(xiàn)原理。具有很好的參考價(jià)值,下面跟著小編一起來看下吧2017-01-01jQuery操作attr、prop、val()/text()/html()、class屬性
這篇文章主要介紹了jQuery操作attr、prop、val()/text()/html()、class屬性 ,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-05-05jQuery Easyui datagrid editor為combobox時(shí)指定數(shù)據(jù)源實(shí)例
當(dāng)在datagrid行內(nèi)部應(yīng)用添加編輯操作時(shí),引入combobox是非常方便的操作,這篇文章主要介紹了jQuery Easyui datagrid editor為combobox時(shí)指定數(shù)據(jù)源實(shí)例,有興趣的可以了解一下。2016-12-12jQuery實(shí)現(xiàn)列表內(nèi)容的動(dòng)態(tài)載入特效
這里給大家分享的是使用jQuery實(shí)現(xiàn)列表內(nèi)容的動(dòng)態(tài)載入的特效,效果相當(dāng)棒,后面附上瀑布流的實(shí)現(xiàn)思路和關(guān)鍵代碼,有需要的小伙伴可以參考下。2015-08-08EasyUI實(shí)現(xiàn)二級頁面的內(nèi)容勾選的方法
在使用EasyUI的時(shí)候,我們經(jīng)?;赜龅皆诙夗撁孢M(jìn)行勾選的時(shí)候,這里給大家分享一個(gè)比較簡單實(shí)用的實(shí)現(xiàn)方法,希望大家能夠喜歡。2015-03-03基于JQuery的6個(gè)Tab選項(xiàng)卡插件
今天在修整博客側(cè)欄信息時(shí),利用到了Tab選項(xiàng)卡方式,因?yàn)閆Blog封裝的是JQuery庫,所以很自然地就想到了IdTabs。2010-09-09jquery上傳插件fineuploader上傳文件使用方法(jquery圖片上傳插件)
這篇文章主要介紹了jquery插件fineuploader上傳文件很用方法2013-12-12