jquery彈出下拉列表插件(實現kindeditor的@功能)

来源:http://www.cnblogs.com/lovesong/archive/2016/08/13/5769008.html
-Advertisement-
Play Games

這幾天有個工作需求,就是在富文本輸入區域(kindeditor)可以有@功能,能夠容易提示用戶名的(像在qq群組@人一樣)。在網上找了一個叫bootstrap-suggest的插件,卻不能滿足我的需求,於是我決定在該插件上改良,主要是下麵幾點: 1. @內容的輸入,能夠匹配多個屬性值。 2. 選中列 ...


這幾天有個工作需求,就是在富文本輸入區域(kindeditor)可以有@功能,能夠容易提示用戶名的(像在qq群組@人一樣)。在網上找了一個叫bootstrap-suggest的插件,卻不能滿足我的需求,於是我決定在該插件上改良,主要是下麵幾點:

1. @內容的輸入,能夠匹配多個屬性值。

2. 選中列表值後,是成塊插入kindeditor的(方便刪除,也利於區分文本)。

3. 修正輸入偶數關鍵字@功能失效問題。

前言

在一開始,我用bootstrap-suggest(https://github.com/lodev09/bootstrap-suggest),這個插件能夠實現以下效果。

但是我發覺有幾個問題:

1. 只能單一匹配(可能存在需要匹配拼音或中文)。

2. 偶數位的@功能會失效。

3. 選取值後,只是簡單文本(沒有qq一樣那種成塊效果)。

jquery-kindeditor-suggest

由於我不想重覆造輪子,於是決定在上面插件做調整,以滿足我的需求,有幾個關鍵地方需說明。

1. startOffset取值錯誤問題。

如果使用了KindEditor的insertHTML,會導致下一次startOffset取值出錯。原插件在獲取游標位置(top,left)時,會需要插入一個span去獲取,在獲取完後刪除,但是這時候下一次editor.cmd.range.startOffset;就出錯。

於是我修改了插入的方式:

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. 替換選擇值

將@後面的輸入內容刪除(包含@),然後插入一個完整的標簽(選擇值),還要保證游標位置正確。

var dType = !!el.cmd.range.startContainer.data ? "data" : "innerHTML"; //這個取值最關鍵
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+'&nbsp;</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行。

修改後效果

內容是富文本輸入區域,插入的成塊文本。

 

總結

雖然是基於他人的插件,但我在修複問題上也花費了很多心思,之前一直發現沒有精確針對kindeditord @功能的插件,所以我就自己弄了下。

我把源代碼放在Github上了,有需要的可去下https://github.com/codingforme/jquery-kindeditor-suggest

 

本文為原創文章,轉載請保留原出處,方便溯源,如有錯誤地方,謝謝指正。

本文地址 :http://www.cnblogs.com/lovesong/p/5769008.html


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 為什麼需要非同步?why?來看一段代碼。 問題1: for(var i=0;i<100000;i++){ } alert('hello world!!!'); 這段代碼的意思是執行100...次後再執行alert,這樣帶來的問題是,嚴重堵塞了後面代碼的執行,至於為什麼,主要是因為JS是單線程的。 問題 ...
  • 各位好啊,我又和大家見面了,也許你已經不記得大明湖畔的容嬤嬤,但是只要記得博客園中的我就好,希望我的博客能像一股清風,為你驅散炎熱的酷暑,好了,廢話不多說,開始上乾貨,我今天帶給大家的是前端工程化開發yeoman,bower ,grunt . 關於這三個工具在這裡就不過多介紹了,沒有用過的散仙們可以 ...
  • 在公司中使用nodejs構建代理伺服器實現前後臺分離,代碼不能拿出來,然後出現httpProxy代理資源的時候老是出現404.明明被代理的介面是存在的。代碼大概如下: 然後報錯或者是404錯誤碼。 解決方案: 在代理請求中,把請求頭中的host給刪除,改進代碼如下: 然後如期運行正確。 http:/ ...
  • 一些常見的狀態碼為: 200 - 伺服器成功返回網頁 404 - 請求的網頁不存在 503 - 服務不可用 所有狀態解釋: 1xx(臨時響應)表示臨時響應並需要請求者繼續執行操作的狀態代碼。代碼 說明 100 (繼續) 請求者應當繼續提出請求。 伺服器返回此代碼表示已收到請求的第一部分,正在等待其餘 ...
  • Range對象基本用法 效果圖如下(在谷歌瀏覽器下的展示) 代碼如下 在火狐瀏覽器下的展示 為什麼會出現這種情況呢,因為火狐瀏覽器下可以針對不連續的內容多選. Range對象之SelectNode和selectNodeContents方法 效果圖如下 代碼內容如下: selectNodeConten ...
  • 本篇介紹如何創建一個ExtJS應用程式。並通過創建目錄、導入文件、編寫代碼及分析代碼等步驟來解釋第一個ExtJS程式。 ...
  • 最近在刷 fcc的題,跟升級打怪一樣,一關一關的過,還挺吸引我的。今天抽時間把 Basic Algorithm Scritping 這部分題做了,根據一些提示,還是比較簡單的。有些題的處理方式 方法,我想值得借鑒。比如在項目中有時候要處理一個字元,如果想不到一些相關的方法,還挺費事的,所以,在此記錄 ...
  • 很久之前就看了有關JavaScript繼承,都沒怎麼總結,剛好今天有空就來聊聊唄 (^o^)/ 通過不斷試驗 來檢驗自己理解的正確性。 首先JavaScript裡面所有的數據類型都是對象(object),其中的new命令引入Javascript,用來從原型對象生成一個實例對象。 (這裡請註意:在Ja ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...