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 имеют принятые ответы.