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 相关文章推荐
JavaScript面向对象程序设计三 原型模式(上)
Dec 21 Javascript
基于Jquery实现键盘按键监听
May 11 Javascript
javascript实现手机震动API代码
Aug 05 Javascript
深入理解js promise chain
May 05 Javascript
js获取元素的外链样式的简单实现方法
Jun 06 Javascript
JS请求servlet功能示例
Jun 01 Javascript
Vue.js中的图片引用路径的方式
Jul 28 Javascript
基于node.js实现微信支付退款功能
Dec 19 Javascript
web前端vue filter 过滤器
Jan 12 Javascript
官方推荐react-navigation的具体使用详解
May 08 Javascript
JS根据Unix时间戳显示发布时间是多久前【项目实测】
Jul 10 Javascript
Javascript柯里化实现原理及作用解析
Oct 22 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 STRING 陷阱原理说明
2010/07/24 PHP
Php Ctemplate引擎开发相关内容
2012/03/03 PHP
解析php 版获取重定向后的地址(代码)
2013/06/26 PHP
PHPMailer的主要功能特点和简单使用说明
2014/02/17 PHP
php中smarty区域循环的方法
2015/06/11 PHP
PHP在线打包下载功能示例
2016/10/15 PHP
PHP实现笛卡尔积算法的实例讲解
2019/12/22 PHP
form中限制文本字节数js代码
2007/06/10 Javascript
基于jquery的分页控件(C#)
2011/01/06 Javascript
jquery绑定原理 简单解析与实现代码分享
2011/09/06 Javascript
JS小功能(列表页面隔行变色)简单实现
2013/11/28 Javascript
jquery如何实现锚点链接之间的平滑滚动
2013/12/02 Javascript
jquery的ajax和getJson跨域获取json数据的实现方法
2014/02/04 Javascript
nodejs中使用monk访问mongodb
2014/07/06 NodeJs
javascript比较两个日期相差天数的方法
2015/07/23 Javascript
jQuery实现的个性化返回底部与返回顶部特效代码
2015/10/30 Javascript
辨析JavaScript中的Undefined类型与null类型
2016/05/26 Javascript
Js查找字符串中出现次数最多的字符及个数实例解析
2016/09/05 Javascript
JSON与XML的区别对比及案例应用
2016/11/11 Javascript
angularjs指令之绑定策略(@、=、&amp;)
2017/04/13 Javascript
基于js中的原型(全面讲解)
2017/09/19 Javascript
JavaScript简单实现合并两个Json对象的方法示例
2017/10/16 Javascript
jQuery实现动态显示select下拉列表数据的方法
2018/02/05 jQuery
纯js封装的ajax功能函数与用法示例
2018/05/14 Javascript
一篇文章带你从零快速上手Rollup
2020/09/07 Javascript
低版本中Python除法运算小技巧
2015/04/05 Python
简单的连接MySQL与Python的Bottle框架的方法
2015/04/30 Python
python中模块查找的原理与方法详解
2017/08/11 Python
python中实现延时回调普通函数示例代码
2017/09/08 Python
numpy中实现ndarray数组返回符合特定条件的索引方法
2018/04/17 Python
django mysql数据库及图片上传接口详解
2019/07/18 Python
python自动点赞功能的实现思路
2020/02/26 Python
Chicco婴儿用品美国官网:汽车座椅、婴儿推车、高脚椅等
2018/11/05 全球购物
The Body Shop美体小铺西班牙官网:天然化妆品
2019/06/21 全球购物
婚庆答谢词大全
2015/09/29 职场文书
Python实现制作销售数据可视化看板详解
2021/11/27 Python