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 相关文章推荐
innerHTML,outerHTML,innerTEXT三者之间的区别
Jan 28 Javascript
精通JavaScript 纠正 cleanWhitespace函数
Mar 11 Javascript
Jquery动态更改一张位图的src与Attr的使用
Jul 31 Javascript
JS实现表单中checkbox对勾选中增加边框显示效果
Aug 21 Javascript
学习JavaScript设计模式(封装)
Nov 26 Javascript
JS实现单击输入框弹出选择框效果完整实例
Dec 14 Javascript
JavaScript运行过程中的“预编译阶段”和“执行阶段”
Dec 16 Javascript
jQuery回调方法使用示例
Jun 26 jQuery
jQuery实现frame之间互通的方法
Jun 26 jQuery
利用canvas实现的加载动画效果实例代码
Jul 05 Javascript
jquery select插件异步实时搜索实例代码
Oct 20 jQuery
JS addEventListener()和attachEvent()方法实现注册事件
Jan 11 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不用正则采集速度探究总结
2008/03/24 PHP
php中如何判断一个网页请求是ajax请求还是普通请求
2013/08/10 PHP
PHP遍历XML文档所有节点的方法
2015/03/12 PHP
PHP的Yii框架中过滤器相关的使用总结
2016/03/29 PHP
PHP判断是否微信访问的方法示例
2019/03/27 PHP
Laravel 类和接口注入相关的代码
2019/10/15 PHP
srcElement表格样式
2006/09/03 Javascript
锋利的jQuery jQuery中的DOM操作
2010/03/21 Javascript
你一定会收藏的Nodejs代码片段
2016/02/04 NodeJs
jquery trigger函数执行两次的解决方法
2016/02/29 Javascript
每日十条JavaScript经验技巧(二)
2016/06/23 Javascript
jQuery之动画效果大全
2016/11/09 Javascript
VueJS全面解析
2016/11/10 Javascript
vue-resource请求实现http登录拦截或者路由拦截的方法
2018/07/11 Javascript
微信小程序实现slideUp、slideDown滑动效果及点击空白隐藏功能示例
2018/12/11 Javascript
layui实现把数据表格时间戳转换为时间格式的例子
2019/09/12 Javascript
vue-cli3 取消eslint校验代码的解决办法
2020/01/16 Javascript
微信小程序学习总结(四)事件与冒泡实例分析
2020/06/04 Javascript
谈谈JavaScript中的函数
2020/09/08 Javascript
跟老齐学Python之让人欢喜让人忧的迭代
2014/10/02 Python
通过数据库向Django模型添加字段的示例
2015/07/21 Python
win10下Python3.6安装、配置以及pip安装包教程
2017/10/01 Python
python设计tcp数据包协议类的例子
2019/07/23 Python
如何基于Python实现电子邮件的发送
2019/12/16 Python
浅谈ROC曲线的最佳阈值如何选取
2020/02/28 Python
pytorch  网络参数 weight bias 初始化详解
2020/06/24 Python
阿迪达斯荷兰官方网站:adidas荷兰
2018/03/16 全球购物
瑞典轮胎在线:Tirendo.se
2018/06/21 全球购物
英文自荐信
2013/12/19 职场文书
师德师风演讲稿
2014/05/05 职场文书
走群众路线剖析材料
2014/10/09 职场文书
综治维稳工作汇报
2014/10/27 职场文书
单位个人查摆问题及整改措施
2014/10/28 职场文书
岗位竞聘报告范文
2014/11/06 职场文书
Canvas跟随鼠标炫彩小球的实现
2021/04/11 Javascript
MySQL系列之十四 MySQL的高可用实现
2021/07/02 MySQL