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 left,right,mid函数
Jun 10 Javascript
Jquery刷新页面背景图片随机变换的实现方法
Mar 15 Javascript
js中opener与parent的区别详细解析
Jan 14 Javascript
jQuery中wrapInner()方法用法实例
Jan 16 Javascript
ECMAScript中函数function类型
Jun 03 Javascript
JavaScript实现LI列表数据绑定的方法
Aug 04 Javascript
javascript实现二级级联菜单的简单制作
Nov 19 Javascript
jQuery插件编写步骤详解
Jun 03 Javascript
最原始的jQuery注册验证方式
Oct 11 Javascript
JavaScript进阶(四)原型与原型链用法实例分析
May 09 Javascript
最全vue的vue-amap使用高德地图插件画多边形范围的示例代码
Jul 17 Javascript
js基于div丝滑实现贝塞尔曲线
Sep 23 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 SPL使用方法和他的威力
2013/11/12 PHP
PHP 提取图片img标记中的任意属性的简单实例
2013/12/10 PHP
win7 64位系统 配置php最新版开发环境(php+Apache+mysql)
2014/08/15 PHP
PHP如何实现Unicode和Utf-8编码相互转换
2015/07/29 PHP
使用PHP和JavaScript判断请求是否来自微信内浏览器
2015/08/18 PHP
Zend Framework教程之Application用法实例详解
2016/03/14 PHP
javascript 函数式编程
2007/08/16 Javascript
select、radio表单回显功能实现避免使用jquery载入赋值
2013/06/08 Javascript
Javascript控制页面链接在新窗口打开具体方法
2013/08/16 Javascript
jquery获得keycode的示例代码
2013/12/30 Javascript
Backbone.js的Hello World程序实例
2015/06/19 Javascript
浅谈JavaScript中变量和函数声明的提升
2016/08/09 Javascript
ros::spin() 和 ros::spinOnce()函数的区别及详解
2016/10/01 Javascript
js定时器实例分享
2016/12/20 Javascript
Easyui Tree获取当前选择节点的所有顶级父节点
2017/02/14 Javascript
jQuery extend()详解及简单实例
2017/05/06 jQuery
Webpack执行命令参数详解
2017/06/17 Javascript
Vue.js表单标签中的单选按钮、复选按钮和下拉列表的取值问题
2017/11/22 Javascript
微信小程序使用gitee进行版本管理
2018/09/20 Javascript
vue数据操作之点击事件实现num加减功能示例
2019/01/19 Javascript
JQuery获取元素尺寸、位置及页面滚动事件应用示例
2019/05/14 jQuery
vue简单封装axios插件和接口的统一管理操作示例
2020/02/02 Javascript
JS面向对象编程基础篇(二) 封装操作实例详解
2020/03/03 Javascript
node.js爬虫框架node-crawler初体验
2020/10/29 Javascript
详解Python的collections模块中的deque双端队列结构
2016/07/07 Python
Python中的pygal安装和绘制直方图代码分享
2017/12/08 Python
python使用opencv按一定间隔截取视频帧
2018/03/06 Python
Python实现使用卷积提取图片轮廓功能示例
2018/05/12 Python
利用Python进行图像的加法,图像混合(附代码)
2019/07/14 Python
Python3.7基于hashlib和Crypto实现加签验签功能(实例代码)
2019/12/04 Python
keras小技巧——获取某一个网络层的输出方式
2020/05/23 Python
如何用Python来进行查询和替换一个文本字符串
2014/01/02 面试题
我的未来不是梦演讲稿
2014/09/02 职场文书
党课培训心得体会
2014/09/02 职场文书
MySQL数据库Innodb 引擎实现mvcc锁
2022/05/06 MySQL
python神经网络Xception模型
2022/05/06 Python