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实现二分查找法实现代码
Nov 12 Javascript
js获取浏览器的可视区域尺寸的实现代码
Nov 30 Javascript
JavaScript原生对象之Number对象的属性和方法详解
Mar 13 Javascript
JS获取月份最后天数、最大天数与某日周数的方法
Dec 08 Javascript
jquery拖拽排序简单实现方法(效果增强版)
Feb 16 Javascript
浅谈原生JS中的延迟脚本和异步脚本
Jul 12 Javascript
Angular.js初始化之ng-app的自动绑定与手动绑定详解
Jul 31 Javascript
利用JS实现一个同Excel表现的智能填充算法
Aug 13 Javascript
小程序云开发获取不到数据库记录的解决方法
May 18 Javascript
javascript 原型与原型链的理解及应用实例分析
Feb 10 Javascript
如何解决vue在ios微信&quot;复制链接&quot;功能问题
Mar 26 Javascript
使用eslint和githooks统一前端风格的技巧
Jul 29 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实现递归循环每一个目录
2010/08/08 PHP
PHP中使用foreach和引用导致程序BUG的问题介绍
2012/09/05 PHP
php获取网页中图片、DIV内容的简单方法
2014/06/19 PHP
PHP判断IP并转跳到相应城市分站的方法
2015/03/25 PHP
适用于初学者的简易PHP文件上传类
2015/10/29 PHP
Thinkphp5框架简单实现钩子(Hook)行为的方法示例
2019/09/03 PHP
WordPress JQuery处理沙发头像
2009/06/22 Javascript
jQuery图片滚动图片的效果(另类实现)
2013/06/02 Javascript
js实现的标题栏新消息闪烁提示效果
2014/06/06 Javascript
js实现键盘控制DIV移动的方法
2015/01/10 Javascript
javascript无刷新评论实现方法
2015/05/13 Javascript
在JavaScript中使用NaN值的方法
2015/06/05 Javascript
JS实现的另类手风琴效果网页内容切换代码
2015/09/08 Javascript
Eclipse引入jquery报错如何解决
2015/12/01 Javascript
初识简单却不失优雅的Vue.js
2016/09/12 Javascript
详解vue-cli3多环境打包配置
2019/03/28 Javascript
vue element-ui实现动态面包屑导航
2019/12/23 Javascript
[02:19]DOTA2上海特级锦标赛 观赛指南 Spectator Guide
2016/02/04 DOTA
[03:13]DOTA2-DPC中国联赛1月25日Recap集锦
2021/03/11 DOTA
Python中super关键字用法实例分析
2015/05/28 Python
Python字符串拼接、截取及替换方法总结分析
2016/04/13 Python
pycharm下查看python的变量类型和变量内容的方法
2018/06/26 Python
python开启摄像头以及深度学习实现目标检测方法
2018/08/03 Python
python使用Plotly绘图工具绘制散点图、线形图
2019/04/02 Python
django中嵌套的try-except实例
2020/05/21 Python
linux centos 7.x 安装 python3.x 替换 python2.x的过程解析
2020/12/14 Python
css3与html5实现响应式导航菜单(导航栏)效果分享
2014/02/12 HTML / CSS
黄色火烈鸟:De Gele Flamingo
2019/03/18 全球购物
文明餐桌活动方案
2014/02/11 职场文书
小学校园广播稿集锦
2014/10/04 职场文书
交通事故赔偿协议书
2014/10/16 职场文书
公司停电通知
2015/04/15 职场文书
故意伤害辩护词
2015/05/21 职场文书
2015年学校远程教育工作总结
2015/07/20 职场文书
运动员代表致辞
2015/07/29 职场文书
MySQL 外键约束和表关系相关总结
2021/06/20 MySQL