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 相关文章推荐
jquery实现全选和全不选功能效果的实现代码【推荐】
May 05 Javascript
JS产生随机数的几个用法详解
Jun 22 Javascript
angularjs 中$apply,$digest,$watch详解
Oct 13 Javascript
Bootstrap中glyphicons-halflings-regular.woff字体报404错notfound的解决方法
Jan 19 Javascript
JavaScript验证知识整理
Mar 24 Javascript
jQuery实现简单的滑动导航代码(移动端)
May 22 jQuery
Angular2开发环境搭建教程之VS Code
Dec 15 Javascript
让axios发送表单请求形式的键值对post数据的实例
Aug 11 Javascript
你可能不知道的CORS跨域资源共享
Mar 13 Javascript
Vue 实现html中根据类型显示内容
Oct 28 Javascript
vue动态渲染svg、添加点击事件的实现
Mar 13 Javascript
JS判断浏览器类型与操作系统的方法分析
Apr 30 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
php 图片上传类代码
2009/07/17 PHP
PHP+Mysql日期时间如何转换(UNIX时间戳和格式化日期)
2012/07/15 PHP
解析php安全性问题中的:Null 字符问题
2013/06/21 PHP
php绘图中显示不出图片的原因及解决
2014/03/05 PHP
PHP实现的多文件上传类及用法示例
2016/05/06 PHP
thinkphp5 加载静态资源路径与常量的方法
2017/12/24 PHP
一个JavaScript继承的实现
2006/10/24 Javascript
JQuery开发的数独游戏代码
2010/10/29 Javascript
JS求平均值的小例子
2013/11/29 Javascript
基于js与flash实现的网站flv视频播放插件代码
2014/10/14 Javascript
javascript实现输出指定行数正方形图案的方法
2015/08/03 Javascript
JavaScript头像上传插件源码分享
2016/03/29 Javascript
BootStrap使用file-input插件上传图片的方法
2016/09/05 Javascript
JS 实现随机验证码功能
2017/02/15 Javascript
axios post提交formdata的实例
2018/03/16 Javascript
详解Vue打包优化之code spliting
2018/04/09 Javascript
Angular2中监听数据更新的方法
2018/08/31 Javascript
工作中常用js功能汇总
2020/11/07 Javascript
详解Python的Django框架中的模版继承
2015/07/16 Python
简单讲解Python中的闭包
2015/08/11 Python
python 平衡二叉树实现代码示例
2018/07/07 Python
聊聊python里如何用Borg pattern实现的单例模式
2019/06/06 Python
python动态进度条的实现代码
2019/07/03 Python
利用Python实现手机短信监控通知的方法
2019/07/22 Python
Python中函数的返回值示例浅析
2019/08/28 Python
Python collections中的双向队列deque简单介绍详解
2019/11/04 Python
Python爬取网页信息的示例
2020/09/24 Python
Pycharm Plugins加载失败问题解决方案
2020/11/28 Python
西班牙Polo衫品牌:Polo Club
2020/08/09 全球购物
庆国庆活动总结
2014/08/28 职场文书
运动会铅球比赛加油稿
2014/09/26 职场文书
2015小学音乐教师个人工作总结
2015/07/21 职场文书
护士岗位竞聘书
2015/09/15 职场文书
导游词之任弼时故居
2020/01/07 职场文书
一文帮你理解PReact10.5.13源码
2021/04/03 Javascript
HTML+JS实现在线朗读器
2022/02/15 Javascript