可编辑div中包含子元素时获取光标位置不准确的问题
前言:
高亮显示输入框中的关键字符,这就必须得用到可编辑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中包含子元素时获取光标位置不准确的问题的更多相关文章
- 没有高度的div中的子元素高度自动撑开
直接上代码: 很多时候 <!DOCTYPE html> <html lang="en"> <head> <meta charset=&q ...
- CSS 实现:父元素包含子元素,子元素垂直居中布局
☊[实现要求]:父元素包含子元素,子元素垂直居中布局 <div class="demo5"> <div class="child">A& ...
- html 子元素和父元素都监听了 click 事件,点击子元素时为何先触发的是父元素的 click 事件?
先上一段代码,点击子元素时先触发的是父元素的 click 事件 <html> <head> <script type="text/javascript" ...
- EMPTY表示元素不能包含文本,也不能包含子元素
<?xml version=”1.0″ encoding=”GB2312″?> <!ELEMENT Customer EMPTY> <!ATTLIST Customer称 ...
- 2017-02-20 可编辑div中如何在光标位置添加内容
之前做了一个可编辑div需要在里面插入内容,搜了好多代码,就这个能实现我的功能,记录一下,以备以后用 <!DOCTYPE HTML> <html> <head> & ...
- delphi将一个list中包含的元素,从另一个中删除,如果在另一个中存在的话
Function StrList_Del(StrList,DelStrList:String):String; //将DelStrList中包含的元素,从Strlist中删除,如果在Strlist中存 ...
- 二、vue学习--父元素如何获取子元素的值,子元素如何获取父元素的值
下图是父元素: 下图是子元素,获取父元素的值,使用props定义属性,这样就可以获取到父元素上传过来的set .place.type,拿到值就可以做一些自己的逻辑处理 二.子元素给父元素传值? 下 ...
- 通过scrollTop,使子元素滚动至指定位置
想实现这样的一个功能,点击子元素,让元素滚动至指定位置,怎么实现呢? 在代码实现之前,先了解下相关关键点. 1.scrollHeight 属性 通过 scrollHeight 属性可获得子元素的滚动高 ...
- JavaScript 获取输入时的光标位置及场景问题
前言 在输入编辑的业务场景中,可能会需要在光标当前的位置或附近显示提示选项.比如社交评论中的@user功能,要确保提示的用户列表总是出现在@字符右下方,又或者是在自定义编辑器中 autocomplet ...
随机推荐
- Protocol Buffer学习笔记
Protocol Buffer Protobuf基础概念 Protobuf是google开发的数据结构描述语言,能够将结构化数据序列化与反序列化,取代json和xml,常用于服务器通信协议.RPC系统 ...
- 何时需要做urlEncode,以及为什么要做
在RFC1738中,对于URL可以使用的字符集做了如下规定: “ 只有0-9a-zA-Z的字母以及$-_.+!*'(),"这几个特殊字符 ” 而在html4中扩展了所有的unicode ch ...
- CentOS7中永久保存systemd日志
将systemd的日志写入磁盘: 1.在/var/log/目录下创建日志存放目录,并加入systemd-journal的权限: ~]#mkdir /var/log/journal ~]#chown r ...
- Oracle11g服务详细介绍及哪些服务是必须开启的
版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/DaisyLoveZly/article/details/79463713 七个服务的含义分别为:1. ...
- 简说mvc路由
首先我们通过在Global.asax中的Application_Start将路由信息注册到RouteTable的Routes静态属性中.如下代码所示: public class RouteTable ...
- Java代码实现对Azkaban的Flow进行设置定时
代码如下: public class CurlToAzkaban{ public static void scheduleExecute(String flow, String cronExpress ...
- August 29th 2017 Week 35th Tuesday
Life is a pure flame, and we live by an invisible sun within us. 生命如纯洁的火焰,而维系这火焰的是我们内心的太阳. Burn my l ...
- There was a problem confirming the ssl certificate: [SSL: TLSV1_ALERT_PROTOCOL_VERSION] tlsv1 alert protocol version (_ssl.c:661) - skipping
Could not fetch URL https://pypi.python.org/simple/xlrd/: There was a problem confirming the ssl cer ...
- 列表:List<T>与HashSet和只读集合
一.概述 List<T> 是ArrayList类的等效泛型类.属System.Collections.Generic命名空间. 二.声明及初始化 1.List<T> mList ...
- 外网访问用azure虚拟机搭建的网站
1.Ubuntu+Apache+PHP的环境搭建(此处省去了mysql的步骤) 在azure上搭建上述的开发环境和在本地PC搭建是一样的步骤,具体介绍请参看这里. 2.从外网访问 注意,这一步的前提是 ...