Javascript: ошибка 800a025e с использованием селектора диапазонов

Я выполняю эти простые строки javascript в последнем, т.е. 11, просто для выбора всего содержимого div

Вот скриншот из ie11 dev tool

Code and error - screenshot

Как вы можете видеть, IE изменил меня, сказав: "не удалось завершить операцию из-за ошибки 800a025e".

Я не могу понять природу, источник проблемы и другие проблемы с переполнением стека, которые я прочитал, дают мне четкий ответ.

Это полный код моего личного расширения selectText jQuery

jQuery.fn.selectText = function(){
    var doc = document;
    var element = this[0];
    // console.log(this, element);
    if (typeof element == 'undefined') {
        return;
    }
    if (doc.body.createTextRange) {
        var range = document.body.createTextRange();
        range.moveToElementText(element);
        range.select();
    } else if (window.getSelection) {
        var selection = window.getSelection();        
        var range = document.createRange();
        range.selectNodeContents(element);
        selection.removeAllRanges();
        selection.addRange(range);
    }
};

Элемент в этом случае есть

[Object HTMLTableElement]

Изменить 1: с небольшим мод:

var range = document.body.createTextRange();
var retval = range.moveToElementText(element);
console.log (retval);
range.select();

Я могу сказать, что вы retval undefined. Этот код работает на ff без проблем, поэтому селектор элементов в порядке. Версия jQuery - 1.11

Ответ 1

Я решил использовать этот трюк:

Я обернул таблицу html с помощью DIV

Я использую тот же код, что и без изменений, против DIV, вместо использования для выбора только таблицы.

Работает.

Вероятно, таблица html не является выбираемым текстом для IE

Ответ 2

Ни одно из приведенных выше предложений или подсказок не устраняет эту проблему.

Сама проблема вызвана тем, что элементы нетекстового (например, таблицы) собираются вместе с другими элементами в коллекции TextRange. Попытка очистить коллекцию, в то время как эти элементы таблицы остаются в коллекции, безусловно приведет к сообщенной ошибке выше.

Проблема влияет на IE 9/10/11, и для каждого из этих браузеров существуют определенные обходные пути. К сожалению, эти обходные пути несовместимы с другими браузерами (firefox, safari, chrome, edge), поэтому нам нужен особый случай для четкой обработки IE 9/10/11, предоставляя альтернативную обработку для более совместимых со стандартами браузеров. По всей видимости, работает везде, по крайней мере, на момент написания этой статьи:

      if (doc.body.createTextRange) { // All IE but Edge
        var range = doc.body.createTextRange();
        range.collapse();
        range.select();
      }
      else {
        doc.getSelection().removeAllRanges();
      }

Отдельная ветвь IE - это обходной способ очистки диапазона, содержащего элементы таблицы, без фактического вызова метода empty(), который в противном случае приводит к возникновению проблемы.

Ответ 3

Я получил эту ошибку при попытке window.getSelection().removeAllRanges(); и выбора не было. Один из способов - проверить, есть ли выбор в первую очередь:

if (window.getSelection().getRangeAt(0).getClientRects.length > 0) {
    window.getSelection().removeAllRanges();
}

Кроме того, этот вопрос является дубликатом Не удалось выполнить операцию из-за ошибки 800a025e, но я не мог отметить ее как таковую, потому что другой вопрос не" t имеют принятые ответы.