CreateTextRange无法在Chrome中使用

时间:2014-02-05 09:02:08

标签: javascript google-chrome compatibility

在此代码中,createRange无法在Chrome中使用。在IE中,它正在运行。请帮忙解决这个问题。是否有任何其他属性可以像创建范围一样工作。这样对我的项目很有帮助。

<script language=javascript>

    var isSelected;
    function markSelection ( txtObj ) {
      if ( txtObj.createTextRange ) {
        txtObj.caretPos = document.selection.createRange().duplicate();
        isSelected = true;
      }
    }

    function insertTag ( txtName, enclose ) {
        if(document.f_activity_email == null) {
            var tag = document.getElementById('EmailTokenID').value;
        }
        else {
            var formC = document.f_activity_email;
            var tag = formC.EmailTokenID.value;
        }
        var closeTag = tag;
        if ( enclose ) {
            var attribSplit = tag.indexOf ( ' ' );
            if ( tag.indexOf ( ' ' ) > -1 )
              closeTag = tag.substring ( 0, attribSplit );
        }
        if ( isSelected ) {
            var txtObj = eval ( "document.forms[0]." + txtName );
                if (txtObj.createTextRange && txtObj.caretPos) {
                    var caretPos = txtObj.caretPos;
                    caretPos.text = ( ( enclose ) ? "<"+tag+">"+caretPos.text+"</"+closeTag+">" : tag+caretPos.text );
                    markSelection ( txtObj );
                    if ( txtObj.caretPos.text=='' ) {
                     isSelected=false;
                    txtObj.focus();
                }
            }
      } else {
        // placeholder for loss of focus handler
      }
    }

4 个答案:

答案 0 :(得分:12)

CreateTextRange是Microsoft specific function,但有一个简单的解决方法。

使用createRange代替this post,例如:

SELECT MODEL , COUNT(DISTINCT YOUR_COLUMN_NAME)
FROM CAR 
GROUP BY MODEL ;

答案 1 :(得分:3)

createTextRange仅在IE中。

看一下这个 http://help.dottoro.com/ljrvjsfe.php

答案 2 :(得分:2)

我在节点的JSDOM和codemirror(它试图使用document.createRange)时遇到了这个问题。

之所以发生这种情况是因为在JSDOM上,document.createRange(chrome)不存在ATM,因此它会尝试使用document.body.createTextRange(IE)而无法使用。

要修复此问题,我必须在单元测试设置中存根document.createRange函数,如下所示:

global.document.createRange = () => {
  return {
    setEnd: () => {},
    setStart: () => {},
    getBoundingClientRect: () => {}
  }
}

有关于JSDOM polyfilling document.createRange:

的讨论

请参阅https://github.com/tmpvar/jsdom/issues/399

在撰写本文时尚未发生这种情况。

答案 3 :(得分:0)

截至2020年3月31日。这适用于模拟JSDOM进行开玩笑的单元测试

(window as any).global.document.createRange = () => {
    return {
        setEnd: () => {},
        setStart: () => {},
        getBoundingClientRect: () => {},
        getClientRects: () => []
    };
};