获取div编辑框,textarea,input text的光标位置 兼容IE,FF和Chrome的方法介绍


Posted in Javascript onNovember 08, 2012

网上苦找2小时,全是不能兼容FF的,看来这种东西网上是搞不到现成的了,只能自己动手丰衣足食
现在发布出来,今后网上就有现成的供人使用了。

为了省事,少量位置用了jquery 改原生JS也很方便,谁需要就请自己修改了。
欢迎各位路过高人拍板,欢迎各位留言提供改进代码。
又改进 兼容了Chrome 下面的代码已修改成最新版
上源码了

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
<head> 
<title>js获取div编辑框,textarea,input text的光标位置,兼容FF和IE</title> 
<script src="jquery-1.4.4.js" type="text/javascript"></script> 
<script type="text/javascript"> 
//去除左右所有空格 
String.prototype.trim = function () { 
return this.replace(/(^\s*)|(\s*$)/g, ""); 
} 
function getPosition(element) { 
var OsObject = ""; 
if (navigator.userAgent.indexOf("MSIE") > 0) { 
OsObject = "MSIE"; 
} 
if (navigator.userAgent.indexOf("Firefox") > 0) { 
OsObject = "Firefox"; 
} 
if (navigator.userAgent.indexOf("Safari") > 0) { 
OsObject = "Safari"; 
} 
if (navigator.userAgent.indexOf("Camino") > 0) { 
OsObject = "Camino"; 
} 
if (navigator.userAgent.indexOf("Gecko") > 0) { 
OsObject = "Gecko"; 
} 
if (navigator.userAgent.indexOf("Chrome") > 0) { 
OsObject = "Chrome"; 
} var result = 0; 
if (!document.selection) { //非IE浏览器 
var thisTagName = null; 
if ($(element).attr("tagName") != "TEXTAREA" && $(element).attr("tagName") != "INPUT") { 
if ($(element).attr("tagName") == "DIV" && $(element).attr("contenteditable") == "true") { 
thisTagName = window.getSelection().anchorNode.parentElement.tagName; 
} //出自http://www.cnblogs.com/ahjesus 尊重作者辛苦劳动成果,转载请注明出处,谢谢! 
else { 
thisTagName == null; 
} 
} 
else { 
if ($(element).attr("tagName") == "INPUT" && $(element).attr("type") == "text") { 
thisTagName = window.getSelection().anchorNode.tagName; 
} 
else { 
console.log(window.getSelection()); 
thisTagName = window.getSelection().anchorNode.tagName; 
} 
} 
console.log(thisTagName); 
if (thisTagName == "TEXTAREA" || thisTagName == "INPUT" || (thisTagName=="BODY"&&OsObject == "Chrome")) { 
result = element.selectionStart 
} //出自http://www.cnblogs.com/ahjesus 尊重作者辛苦劳动成果,转载请注明出处,谢谢! 
else if (thisTagName != null) { 
if (thisTagName == element.tagName) { 
if (window.getSelection().anchorNode.textContent == $(element).text()) { 
result = window.getSelection().anchorOffset; 
} 
else { 
var currentIndex = window.getSelection().anchorOffset; 
var txt = ""; 
var txtoo = window.getSelection().anchorNode.previousSibling; 
while (txtoo != null) { 
txt += txtoo.textContent; 
txtoo = txtoo.previousSibling; 
} //出自http://www.cnblogs.com/ahjesus 尊重作者辛苦劳动成果,转载请注明出处,谢谢! 
result = txt.trim().length + currentIndex; 
} 
} 
else { 
var currentIndex = window.getSelection().anchorOffset; 
var txt = ""; 
var txtoo = window.getSelection().anchorNode.parentElement.previousSibling; 
while (txtoo != null) { 
txt += txtoo.textContent; 
txtoo = txtoo.previousSibling; 
} 
result = txt.trim().length + currentIndex; 
} 
} //出自http://www.cnblogs.com/ahjesus 尊重作者辛苦劳动成果,转载请注明出处,谢谢! 
else { 
return 0; 
} 
} else { //IE 
var rng; 
if ($(element).attr("tagName") == "TEXTAREA" || ($(element).attr("tagName") == "INPUT" && $(element).attr("type") == "text") || ($(element).attr("tagName") == "DIV" && $(element).attr("contenteditable") == "true")) { 
element.focus(); 
rng = document.selection.createRange(); 
rng.moveStart('character', -element.innerText.length); 
var text = rng.text; 
for (var i = 0; i < element.innerText.length; i++) { 
if (element.innerText.substring(0, i + 1) == text.substring(text.length - i - 1, text.length)) { 
result = i + 1; 
} 
} 
} //出自http://www.cnblogs.com/ahjesus 尊重作者辛苦劳动成果,转载请注明出处,谢谢! 
else { 
return 0; 
} 
} 
return result; 
} 
function getValue(element) { 
var pos = getPosition(element); 
document.getElementById("pnum").value = pos; 
} 
</script> 
<style type="text/css"> 
#Div1, #Div2 
{ 
width: 500px; 
height: 100px; 
border: solid 1px black; 
} 
</style> 
</head> 
<body> 
<input id="pnum" type="text" value="Hello,wellcome to test! 你好,欢迎测试!" onmouseup="getValue(this)" 
style="display: block" /> 
<textarea cols="60" rows="10" onkeyup="getValue(this)" onmouseup="getValue(this)">Hello,wellcome to test! 你好,欢迎测试! 注意源代码开闭合标记之间不能换行,否则统计错误!</textarea> 
<div id="Div1" onclick="getValue(this);" onkeyup="getValue(this);" contenteditable="true">一二三<span>四五</span>六七八<span>九零</span> 注意源代码开闭合标记之间不能换行,否则统计错误!注意div编辑框源码里面是嵌套有其他标签的,可以正常返回正确位置!</div> 
<br /> 
<div id="Div2" onclick="getValue(this);" onkeyup="getValue(this);">一二三四五六<span>七八</span></div> 
</body> 
</html>
Javascript 相关文章推荐
onkeyup,onkeydown和onkeypress的区别介绍
Oct 21 Javascript
JS实现至少包含字母、大小写数字、字符的密码等级的两种方法
Feb 03 Javascript
JavaScript接口的实现三种方式(推荐)
Jun 14 Javascript
BootStrap table使用方法分析
Nov 08 Javascript
JS模拟实现ECMAScript5新增的数组方法
Mar 20 Javascript
Vue.js实战之Vuex的入门教程
Apr 01 Javascript
JS使用tofixed与round处理数据四舍五入的区别
Oct 25 Javascript
vue一个页面实现音乐播放器的示例
Feb 06 Javascript
详解ES6 Symbol 的用途
Oct 14 Javascript
js module大战
Apr 19 Javascript
解决Layui数据表格的宽高问题
Sep 28 Javascript
vue-quill-editor的使用及个性化定制操作
Aug 04 Javascript
javascript模拟select,jselect的方法实现
Nov 08 #Javascript
js实现图片放大缩小功能后进行复杂排序的方法
Nov 08 #Javascript
jquery的ajax()函数传值中文乱码解决方法介绍
Nov 08 #Javascript
表头固定(利用jquery实现原理介绍)
Nov 08 #Javascript
Javascript继承(上)——对象构建介绍
Nov 08 #Javascript
异步javascript的原理和实现技巧介绍
Nov 08 #Javascript
找出字符串中出现次数最多的字母和出现次数精简版
Nov 07 #Javascript
You might like
PHP反转字符串函数strrev()函数的用法
2012/02/04 PHP
php实现图片添加描边字和马赛克的方法
2014/12/10 PHP
php中memcache 基本操作实例
2015/05/17 PHP
PHP处理数组和XML之间的互相转换
2016/06/02 PHP
laravel中的一些简单实用功能
2018/11/03 PHP
兼容多浏览器的iframe自适应高度(ie8 、谷歌浏览器4.0和 firefox3.5.3)
2009/11/04 Javascript
原生JS实现表单checkbook获取已选择的值
2013/07/21 Javascript
使用js操作cookie的一点小收获分享
2013/09/03 Javascript
jquery获取选中的文本和值的方法
2014/07/08 Javascript
浅谈javascript获取元素transform参数
2015/07/24 Javascript
jQuery仅用3行代码实现的显示与隐藏功能完整实例
2015/10/08 Javascript
基于javascript制作微信聊天面板
2020/08/09 Javascript
BootStrap 智能表单实战系列(二)BootStrap支持的类型简介
2016/06/13 Javascript
js正则相关知识点专题
2018/05/10 Javascript
vue+axios新手实践实现登陆的示例代码
2018/06/06 Javascript
js实现unicode码字符串与utf8字节数据互转详解
2019/03/21 Javascript
p5.js绘制旋转的正方形
2019/10/23 Javascript
解决qrcode.js生成二维码时必须定义一个空div的问题
2020/07/09 Javascript
Vue 禁用浏览器的前进后退操作
2020/09/04 Javascript
从零学Python之入门(五)缩进和选择
2014/05/27 Python
Python字符串拼接的几种方法整理
2017/08/02 Python
python实现逐个读取txt字符并修改
2018/12/24 Python
Python设计模式之职责链模式原理与用法实例分析
2019/01/11 Python
对Python获取屏幕截图的4种方法详解
2019/08/27 Python
Python 实现opencv所使用的图片格式与 base64 转换
2020/01/09 Python
python实现图片,视频人脸识别(dlib版)
2020/11/18 Python
利用Python如何画一颗心、小人发射爱心
2021/02/21 Python
Zalando Lounge瑞士:时尚与生活方式购物俱乐部
2020/03/12 全球购物
一份Java笔试题
2012/02/21 面试题
股份合作协议书
2014/04/12 职场文书
校园演讲稿汇总
2014/05/21 职场文书
家长会主持词开场白
2015/05/29 职场文书
关于React Native 无法链接模拟器的问题
2021/06/21 Javascript
oracle索引总结
2021/09/25 Oracle
详解Python中*args和**kwargs的使用
2022/04/07 Python
JavaScript前端面试组合函数
2022/06/21 Javascript