前言:

高亮显示输入框中的关键字符,这就必须得用到可编辑div(或其他标签)元素了,这时我们需要获取光标的位置,以便插入字符。

正文:

正常情况下获取光标位置,代码如下:

 function getPointPorsiton1() {
if (window.getSelection) {
var range = window.getSelection().getRangeAt(0);//创建range
}
else if (document.selection) {
var range = document.selection.createRange();//创建选择对象
}
return range.endOffset;
}

  在可编辑元素中只有文本的情况下,这样写没有问题,但是!!!,当元素内含有标签时,返回如下图

  而我们真正需要的拿到的位置是5(“示例”后有个空格^_^),或者拿到光标前html的长度。

  获取光标前文本长度,代码如下:

 function getPointPositon2() {
if (window.getSelection) {
var range = window.getSelection().getRangeAt(0);//创建range
}
else if (document.selection) {
var range = document.selection.createRange();//创建选择对象
}
var end = range.endOffset;
var preElement = range.endContainer;
while(preElement.previousSibling){
end += preElement.previousSibling.textContent.length;
preElement = preElement.previousSibling;
}
return end;
}

  获取光标前html长度,代码如下:

 function getPointPositon3() {
if (window.getSelection) {
var range = window.getSelection().getRangeAt(0);//创建range
}
else if (document.selection) {
var range = document.selection.createRange();//创建选择对象
}
var end = range.endOffset;
var preElement = range.endContainer;
while(preElement.previousSibling){
if(preElement.previousSibling.outerHTML){
end += preElement.previousSibling.outerHTML.length;
}else{
end += preElement.previousSibling.textContent.length;
}
preElement = preElement.previousSibling;
}
return end;
}

  最终效果图如下:

参考文章:http://www.zhangxinxu.com/wordpress/?p=1591

可编辑div中包含子元素时获取光标位置不准确的问题的更多相关文章

  1. 没有高度的div中的子元素高度自动撑开

     直接上代码: 很多时候 <!DOCTYPE html> <html lang="en"> <head> <meta charset=&q ...

  2. CSS 实现:父元素包含子元素,子元素垂直居中布局

    ☊[实现要求]:父元素包含子元素,子元素垂直居中布局 <div class="demo5"> <div class="child">A& ...

  3. html 子元素和父元素都监听了 click 事件,点击子元素时为何先触发的是父元素的 click 事件?

    先上一段代码,点击子元素时先触发的是父元素的 click 事件 <html> <head> <script type="text/javascript" ...

  4. EMPTY表示元素不能包含文本,也不能包含子元素

    <?xml version=”1.0″ encoding=”GB2312″?> <!ELEMENT Customer EMPTY> <!ATTLIST Customer称 ...

  5. 2017-02-20 可编辑div中如何在光标位置添加内容

    之前做了一个可编辑div需要在里面插入内容,搜了好多代码,就这个能实现我的功能,记录一下,以备以后用 <!DOCTYPE HTML> <html> <head> & ...

  6. delphi将一个list中包含的元素,从另一个中删除,如果在另一个中存在的话

    Function StrList_Del(StrList,DelStrList:String):String; //将DelStrList中包含的元素,从Strlist中删除,如果在Strlist中存 ...

  7. 二、vue学习--父元素如何获取子元素的值,子元素如何获取父元素的值

      下图是父元素: 下图是子元素,获取父元素的值,使用props定义属性,这样就可以获取到父元素上传过来的set .place.type,拿到值就可以做一些自己的逻辑处理 二.子元素给父元素传值? 下 ...

  8. 通过scrollTop,使子元素滚动至指定位置

    想实现这样的一个功能,点击子元素,让元素滚动至指定位置,怎么实现呢? 在代码实现之前,先了解下相关关键点. 1.scrollHeight 属性 通过 scrollHeight 属性可获得子元素的滚动高 ...

  9. JavaScript 获取输入时的光标位置及场景问题

    前言 在输入编辑的业务场景中,可能会需要在光标当前的位置或附近显示提示选项.比如社交评论中的@user功能,要确保提示的用户列表总是出现在@字符右下方,又或者是在自定义编辑器中 autocomplet ...

随机推荐

  1. v-model实现

    v-model就是输入的值实时显示的目的,如果纯粹写登录页面的form控件没有实时显示的需求 就不用绑定v-model.

  2. /etc/vsftpd.conf详解

    #################匿名权限控制############### anonymous_enable=YES  #是否启用匿名用户no_anon_password=YES #匿名用户logi ...

  3. .net core系列之《将.net core应用部署到Ubuntu》

    1.首先准备一个演示项目. 2.然后将这个项目用FileZilla工具上传到Ubuntu中. 3.进入目标文件,接下来有两种方法来部署项目 a.用dotnet run命令 root@hhz-virtu ...

  4. Navicat for mysql 导出导入的问题

    问题现象   1:使用navicat 导出5.6.20版本数据库,然后导入到5.7.19mysql出现错误:  

  5. UDF/UDAF开发总结

    参考文章: https://www.cnblogs.com/itxuexiwang/p/6264547.html https://www.cnblogs.com/eRrsr/p/6096989.htm ...

  6. Excel开发之旅(三)——添加侧边工具栏

    1. 添加自定义用户控件:选择项目添加新建项用户控件.修改文件名,点击添加即可. 2. 重复步骤1,再添加3个自定义控件,接下来我们在自定义用户控件上面添加一些工具箱组件 3. 由于我们添加的是侧边工 ...

  7. 在android工程中添加图片资源(转加)

    在Android工程中,每添加一个资源,就会在gen目录下的R.java中自动生成一个新的静态整型变量来指向这个资源.程序文件中调用资源的时候,先在R.java中找到变量名,然后根据变量值查找资源. ...

  8. tomcat多实例.md

    多tomcat实例 环境说明 操作系统:CentOS 6.6 JDK: # ll /usr/local/java lrwxrwxrwx 1 root root 22 Feb 27 17:43 /usr ...

  9. UVa 1515 - Pool construction(最小割)

    链接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...

  10. WEB安全 ACCESS 注入、盲注脚本

    http://www.xxx.cn/cp.asp?classid=3http://www.xxx.cn/cp.asp?classid=3 and //有拦截关键字http://www.xxx.cn/c ...