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 trim函数 去空格函数与正则集锦
Nov 20 Javascript
DOM 事件流详解
Jan 20 Javascript
angularJs的ng-class切换class
Jun 23 Javascript
解决ie img标签内存泄漏的问题
Oct 13 Javascript
vue-cli 引入、配置axios的方法
May 08 Javascript
详解JS实现系统登录页的登录和验证
Apr 29 Javascript
vue-router两种模式区别及使用注意事项详解
Aug 01 Javascript
vue-router 中 meta的用法详解
Nov 01 Javascript
vue element-ui读取pdf文件的方法
Nov 26 Javascript
Vue实现多标签选择器
Nov 28 Javascript
JS数组方法push()、pop()用法实例分析
Jan 18 Javascript
vue-cli+webpack项目打包到服务器后,ttf字体找不到的解决操作
Aug 28 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树的代码,可以嵌套任意层
2006/10/09 PHP
PHP取进制余数函数代码
2012/01/19 PHP
在vs2010中调试javascript代码方法
2011/02/11 Javascript
cookie在javascript中的使用技巧以及隐私在服务器端的设置
2012/12/03 Javascript
js截取固定长度的中英文字符的简单实例
2013/11/22 Javascript
JavaScript实现大数的运算
2014/11/24 Javascript
Bootstrap每天必学之基础排版
2015/11/20 Javascript
浅谈Sticky组件的改进实现
2016/03/22 Javascript
js基于cookie记录来宾姓名的方法
2016/07/19 Javascript
jQuery实现智能判断固定导航条或侧边栏的方法
2016/09/04 Javascript
AngularJS自定义控件实例详解
2016/12/13 Javascript
详解angular2封装material2对话框组件
2017/03/03 Javascript
js实现点击切换checkbox背景图片的简单实例
2017/05/08 Javascript
开发Vue树形组件的示例代码
2017/12/21 Javascript
vue中axios解决跨域问题和拦截器的使用方法
2018/03/07 Javascript
js+css实现红包雨效果
2018/07/12 Javascript
js中的数组对象排序分析
2018/12/11 Javascript
vue.js高德地图实现热点图代码实例
2019/04/18 Javascript
使用next.js开发网址缩短服务的方法
2020/06/17 Javascript
[03:08]Ti4观战指南上
2014/07/07 DOTA
[15:23]教你分分钟做大人:虚空假面
2014/10/30 DOTA
python使用分治法实现求解最大值的方法
2015/05/12 Python
Python实现简单字典树的方法
2016/04/29 Python
django定期执行任务(实例讲解)
2017/11/03 Python
spark dataframe 将一列展开,把该列所有值都变成新列的方法
2019/01/29 Python
简单了解python shutil模块原理及使用方法
2020/04/28 Python
Python使用Pygame绘制时钟
2020/11/29 Python
日本最大的眼镜购物网站:Oh My Glasses
2016/11/13 全球购物
美国伊甸园兄弟种子公司:Eden Brothers
2018/07/01 全球购物
丹麦优惠购物网站:PLUSSHOP
2019/03/24 全球购物
JPA的优势都有哪些
2013/07/04 面试题
学年自我鉴定范文
2013/10/01 职场文书
树转促学习心得体会
2014/09/10 职场文书
发展党员工作情况汇报
2014/10/28 职场文书
个人业务学习心得体会
2016/01/25 职场文书
CSS实现渐变色边框(Gradient borders)的5种方法
2022/03/25 HTML / CSS