Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/399.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript CreateTextRange在Chrome中不起作用_Javascript_Google Chrome_Compatibility - Fatal编程技术网

Javascript CreateTextRange在Chrome中不起作用

Javascript CreateTextRange在Chrome中不起作用,javascript,google-chrome,compatibility,Javascript,Google Chrome,Compatibility,在此代码中,createRange在Chrome中不起作用。在IE中,它正在工作。请帮助如何纠正这一错误。是否有其他属性可以像“创建范围”一样工作。这样对我的项目会有帮助 <script language=javascript> var isSelected; function markSelection ( txtObj ) { if ( txtObj.createTextRange ) { txtObj.caretPos = docu

在此代码中,
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
      }
    }

被选举出来;
功能标记选择(txtObj){
如果(txtObj.createTextRange){
txtObj.caretPos=document.selection.createRange().duplicate();
isSelected=true;
}
}
函数insertTag(txtName,括起来){
如果(document.f_activity_email==null){
var tag=document.getElementById('EmailTokenID')。值;
}
否则{
var formC=document.f\u活动\u电子邮件;
var tag=formC.EmailTokenID.value;
}
var closeTag=tag;
如果(附上){
var attribSplit=tag.indexOf(“”);
if(tag.indexOf(“”)>-1)
closeTag=tag.substring(0,attribSplit);
}
如果(当选){
var txtObj=eval(“document.forms[0]。”+txtName);
if(txtObj.createTextRange&&txtObj.caretPos){
var caretPos=txtObj.caretPos;
caretPos.text=((括起来)“”+caretPos.text+“”:标记+caretPos.text);
标记选择(txtObj);
if(txtObj.caretPos.text=''){
isSelected=false;
txtObj.focus();
}
}
}否则{
//焦点丢失处理程序的占位符
}
}

createTextRange仅在IE中

看看这个 CreateTextRange是一个很好的解决方案,但有一个简单的解决方法

改为使用,例如:

if (document.selection) { //IE
    var range = document.body.createTextRange();
    range.moveToElementText(document.getElementById(containerid));
    range.select();
} else if (window.getSelection) { //others
    var range = document.createRange();
    range.selectNode(document.getElementById(containerid));
    window.getSelection().addRange(range);
}

我对节点的JSDOM和codemirror(尝试使用document.createRange)有这个问题

之所以会发生这种情况,是因为document.createRange(chrome)在JSDOM上不存在,因此它尝试使用document.body.createTextRange(IE)来代替它,并失败了

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

global.document.createRange = () => {
  return {
    setEnd: () => {},
    setStart: () => {},
    getBoundingClientRect: () => {}
  }
}
有关于JSDOM polyfilling document.createRange的讨论:


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

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

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

“是否有其他属性可以像create range那样工作?”嗨,链接指向。答案是3年前的