jQuery弹出下拉列表插件(实现kindeditor的@功能)


Posted in Javascript onAugust 16, 2016

这几天有个工作需求,就是在富文本输入区域(kindeditor)可以有@功能,能够容易提示用户名的(像在qq群组@人一样)。在网上找了一个叫bootstrap-suggest的插件,却不能满足我的需求,于是我决定在该插件上改良,主要是下面几点:

1. @内容的输入,能够匹配多个属性值。

2. 选中列表值后,是成块插入kindeditor的(方便删除,也利于区分文本)。

3. 修正输入偶数关键字@功能失效问题。

前言

在一开始,我用bootstrap-suggest(https://github.com/lodev09/bootstrap-suggest),这个插件能够实现以下效果。

jQuery弹出下拉列表插件(实现kindeditor的@功能)

但是我发觉有几个问题:

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+' </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行。

修改后效果

内容是富文本输入区域,插入的成块文本。

jQuery弹出下拉列表插件(实现kindeditor的@功能)

总结

虽然是基于他人的插件,但我在修复问题上也花费了很多心思,之前一直发现没有精确针对kindeditord @功能的插件,所以我就自己弄了下。

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

以上所述是小编给大家介绍的jQuery弹出下拉列表插件(实现kindeditor的@功能),希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
JS DOM 操作实现代码
Aug 01 Javascript
jquery控制listbox中项的移动并排序的实现代码
Sep 28 Javascript
自写的一个jQuery圆角插件
Oct 26 Javascript
基于JQuery 的消息提示框效果代码
Jul 31 Javascript
刷新页面的几种方法小结(JS,ASP.NET)
Jan 07 Javascript
JavaScript中rem布局在react中的应用
Dec 09 Javascript
解析微信JS-SDK配置授权,实现分享接口
Dec 09 Javascript
深入理解JS继承和原型链的问题
Dec 17 Javascript
gulp加批处理(.bat)实现ng多应用一键自动化构建
Feb 16 Javascript
微信小程序 JS动态修改样式的实现方法
Dec 16 Javascript
vue实现点击出现操作弹出框的示例
Nov 05 Javascript
夯基础之手撕javascript继承详解
Nov 09 Javascript
javascript验证手机号和实现星号(*)代替实例
Aug 16 #Javascript
解决wx.onMenuShareTimeline出现的问题
Aug 16 #Javascript
JavaScript里 ==与===区别详解
Aug 16 #Javascript
DOM中事件处理概览与原理的全面解析
Aug 16 #Javascript
总结javascript中的六种迭代器
Aug 16 #Javascript
你知道setTimeout是如何运行的吗?
Aug 16 #Javascript
深入理解(function(){... })();
Aug 16 #Javascript
You might like
PR值查询 | PageRank 查询
2006/12/20 PHP
php计算两个日期时间差(返回年、月、日)
2014/06/19 PHP
php ajax异步读取rss文档数据
2016/03/29 PHP
PHP接口继承及接口多继承原理与实现方法详解
2017/10/18 PHP
多个Laravel项目如何共用migrations详解
2018/09/25 PHP
js程序中美元符号$是什么
2008/06/05 Javascript
测试你的JS的掌握程度的代码
2009/12/09 Javascript
动态调用CSS文件的JS代码
2010/07/29 Javascript
Jquery 数据选择插件Pickerbox使用介绍
2012/08/24 Javascript
cookie 最近浏览记录(中文escape转码)具体实现
2013/06/08 Javascript
iframe父页面获取子页面参数的方法
2014/02/21 Javascript
jquery mobile动态添加元素之后不能正确渲染解决方法说明
2014/03/05 Javascript
JQuery勾选指定name的复选框集合并显示的方法
2015/05/18 Javascript
JavaScript实现单击下拉框选择直接跳转页面的方法
2015/07/02 Javascript
JavaScript访问字符串中单个字符的两种方法
2015/07/03 Javascript
jQuery实现鼠标经过时出现隐藏层文字链接的方法
2015/10/12 Javascript
基于jquery实现最简单的选项卡切换效果
2016/05/08 Javascript
浅析jquery unbind()方法移除元素绑定的事件
2016/05/24 Javascript
jquery easyui validatebox remote的使用详解
2016/11/09 Javascript
JS实现鼠标移上去显示图片或微信二维码
2016/12/14 Javascript
微信小程序实现全国机场索引列表
2018/01/31 Javascript
element ui 对话框el-dialog关闭事件详解
2018/02/26 Javascript
vue.js+elementUI实现点击左右箭头切换头像功能(类似轮播图效果)
2019/09/05 Javascript
JS+CSS+HTML实现“代码雨”类似黑客帝国文字下落效果
2020/03/17 Javascript
Vue-cli 移动端布局和动画使用详解
2020/08/10 Javascript
Vue自定义多选组件使用详解
2020/09/08 Javascript
Python遍历zip文件输出名称时出现乱码问题的解决方法
2015/04/08 Python
Python连接PostgreSQL数据库的方法
2016/11/28 Python
Python之os操作方法(详解)
2017/06/15 Python
python3下使用cv2.imwrite存储带有中文路径图片的方法
2018/05/10 Python
python绘制中国大陆人口热力图
2018/11/07 Python
快速创建 HTML5 Canvas 电信网络拓扑图的示例代码
2018/03/21 HTML / CSS
二年级班级文化建设方案
2014/05/10 职场文书
幼儿园六一活动总结
2014/08/27 职场文书
幼儿园2015年度工作总结
2015/04/01 职场文书
Python Pandas模块实现数据的统计分析的方法
2021/06/24 Python