可编辑 DIV 兼容 chrome,ie9-10,ie11改进

只为了兼容一个IE11发火,两天两夜没怎么睡觉哭,一边看着武则天秘史奋斗,足足看了45集,可怜终于做出来了睡觉,谁设计的IE11,为什么要改了改去,range,selection,documnent,getSelection(),w3c,js ,jquery1.4.1,IE11,不说了,代码奉上,感谢原作者ahjesus,不多说了,还有8集呢.

<!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">
<!--<meta http-equiv="X-UA-Compatible" content="IE=9" /> -->
<head>
    <title>js获取div编辑框,textarea,input text的光标位置,兼容FF和IE</title>
    <script src="C:/js/jquery-1.4.1.js" type="text/javascript"></script>
    <!--  <script src="C:/js/jquery-1.10.2.min.js" type="text/javascript"></script>   -->
    <script type="text/javascript">
        var pos=0;//光标初始位置
        //去除左右所有空格
        String.prototype.trim = function () {
            return this.replace(/(^\s*)|(\s*$)/g, "");
        }
        function getPosition(element) {
            debugger;
            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浏览器 IE11不支持document.selection 


                if (Object.hasOwnProperty.call(window, "ActiveXObject") && !window.ActiveXObject) {     // is IE11 wulongfei 2015-1120--2015-1122
                    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();
                     var anchorNodeProp = window.getSelection().anchorNode; //当前节点
                     var currentIndex = window.getSelection().anchorOffset;//2015-11-20 ie11
                     var selectionnode = window.getSelection().focusNode;测试 
                     var selection = window.getSelection().focusOffset;//测试   
                     var range2=document.getSelection().getRangeAt(0);//测试 


                     var isEnd=range2.endContainer.parentNode.nextSibling;


                     var preNode=anchorNodeProp.previousSibling;//前一个节点//测试 
                     var parentNode=anchorNodeProp.parentNode;//父节点//测试 
                     var anchlist=parentNode.childNodes;//测试 


                     //console.log(window.getSelection().anchorNode.textContent);
                    // console.log(window.getSelection().anchorNode.parentNode.textContent);
                    // console.log($(element).text());


                     //if(isEnd==null){
                     //       result=$(element).text().length;
                    // } else if (window.getSelection().anchorNode.textContent == $(element).text()) {//普通文字 点击在末尾
                                     //result = window.getSelection().anchorOffset;//废弃
                    //     result=window.getSelection().anchorNode.parentNode.textContent.length;
                    // }else{
                     
                     //var anchorNodeProp = window.getSelection().anchorNode; //当前节点    
                     var range=document.getSelection().getRangeAt(0);
                    // var preNodeste=range.commonAncestorContainer.parentNode.previousSibling.wholeTest;


                    var txt = "";
                    // var txtoo = window.getSelection().anchorNode.previousSibling;
                    //var txtoo = range.startContainer.parentNode.previousSibling;//测试 有span
                    var txtoo = range.startContainer.previousSibling;
                   // var txtoo2 = range.endContainer.previousSibling;//测试 
                    var txt3 = "";//测试 
                    var txtoo3 = range.endContainer.parentNode.previousSibling;//测试 
                   // console.log(txtoo.textContent);
                   // console.log(txtoo2.textContent);
                    debugger;
                    //var txtoo=window.getSelection().focusNode.parentNode.previousSibling;//
                    while (txtoo != null) {
                        txt += txtoo.textContent;
                        txtoo = txtoo.previousSibling;
                        //txtoo3 = txtoo3.previousSibling;//测试 
                    } 
                    console.log(range.endContainer.parentNode.nodeName);
                    var t3nodeName=range.endContainer.parentNode.nodeName;
                    while (txtoo3 != null&&t3nodeName!='DIV') {
                        txt3 += txtoo3.textContent;
                        txtoo3 = txtoo3.previousSibling;
                        //txtoo3 = txtoo3.previousSibling;//测试 
                    } 
                    debugger;//测试 
                    if(t3nodeName!='DIV'){
                        result=txt3.length+currentIndex;//测试 
                    }else{
                        result=txt.length+currentIndex;//测试 
                    }
                     
                    // result = txt.length + currentIndex;//2015-11-20 ie11兼容  
                   // }




                }else {
                         return 0;
                    } 


                }
                else{//非ie11     // is IE11 wulongfei 2015-1120--2015-1122
                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.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.length + currentIndex;
                    }
                } //出自http://www.cnblogs.com/ahjesus 尊重作者辛苦劳动成果,转载请注明出处,谢谢!
                else {
                    return 0;
                }
              }//非ie11  
            } 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 = window.getSelection();
                   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(aaa) {//获得光标位置
            pos = getPosition(aaa);
            //alert(pos);
            document.getElementById("pnum").value = pos;
        }
        function changeSelectVer(aaa,value){
            debugger;
               // var value2="<span style='color:red;'>"+"${"+value+"}"+"</span>";
               var value2="${"+value+"}";
                //alert(value2);
                var str1=$("#Div1").text();//获取短信脚本里的文字  不包括标签
                //alert(str1);
                var fx1=str1.substring(0,pos);
                var fx2=str1.substring(pos,str1.length);
                var str2=fx1+value2+fx2;
                //alert(str2);
                console.log(str2);
                var str3='';
                if(str2.indexOf("$")>=0){
                    //1.根据$进行分割
                    var stringarray=[];
                    stringarray=str2.split("$");
                    
                    for(var j=0;j<stringarray.length;j++){
                       // alert(stringarray[j]);
                        //2.进行正则替换
                        var reg1=new RegExp(/[\({][a-zA-Z]*[\})]/);
                        var strg1=stringarray[j];
                        var ms=strg1.match(reg1);
                        var we="<span style='color:red;'>"+"$"+ms+"</span>";
                        var strg2=strg1.replace(ms,we);
                        str3=str3+strg2;
                    }
                   
                   // alert(str2.length);//z作为文字长度记录  不包括$
                    //alert(reg1.test(str2));
                    //match=reg1.exec(str2); 
                   // var reg1=new RegExp(/[\({][a-zA-Z]*[\})]/ig);  //ig表示采集数组
                     //var arrMactches =[];
                    // arrMactches = str2.match(reg1);
                    //for (var i=0;i < arrMactches.length;i++){
                        //alert(arrMactches[i]); 
                      //  var ms=arrMactches[i];
                       // var we="<span style='color:red;'>"+ms+"</span>";                       
                       // str2=str2.replace(ms,we);
                   // }
                }
                     //alert(str2);
                $("#Div1").html(str3);    
                $("#myVerStr").val('');
               


        }
    </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! 你好,欢迎测试!" οnmοuseup="getValue(this)"
        style="display: block" />
    <div style='width:400px;height:100px'>
        <select id='myVerStr' name='verstr' οnchange="changeSelectVer(this,this.value)" style="width:100%;height:20%;">
            <option value="">请单击添加</option>
            <option value="Name">姓名Name</option>
            <option value="Age">年龄Age</option>
            <option value="Amount">金额Amount</option>
            <option value="Per">次数Per</option>
        </select>
    </div>




    <div id="Div1" οnclick="getValue(this);" οnkeyup="getValue(this);" contenteditable="true" style="word-break:break-all;width:600px;height:200px;">一二三<span>四五</span>六七八<span>九零</span> 注意源代码开闭合标记之间不能换行,否则统计错误!注意div编辑框源码里面是嵌套有其他标签的,可以正常返回正确位置!</div>
    <br />
    <!--<div id="Div2" οnclick="getValue(this);" οnkeyup="getValue(this);">一二三四五六<span>七八</span></div>-->
</body>
</html>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值