13

Вопрос по javascript, compatibility, google-chrome – CreateTextRange не работает в Chrome

В этом коде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
      }
    }
3 ответа
12

CreateTextRange является

Специфическая функция Microsoft, но есть легкая работа вокруг.

использованиеcreateRange вместо того, чтобы вэта почта например:

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);
}
3

createTextRange есть только в IE.

Посмотри на этоhttp://help.dottoro.com/ljrvjsfe.php

"Есть ли какое-либо другое свойство, чтобы работать как создать диапазон?"

от nnnnnn
2

У меня была эта проблема с JSDOM узла и codemirror (который пытается и

спользовать document.createRange)

Это происходит потому, что document.createRange (chrome) не существует ATM в JSDOM, и поэтому он пытается использовать document.body.createTextRange (IE) и падает.

Чтобы это исправить, мне пришлось заглушить функцию document.createRange в моей настройке модульного теста следующим образом:

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

Говорят о полизаполнении JSDOM document.createRange:

Увидетьhttps://github.com/tmpvar/jsdom/issues/399

На момент написания этого еще не произошло.

Похожие вопросы