Почему выбор.getComposeRanges() завершается с ошибкой типа в IOSIOS

Программируем под IOS
Ответить
Anonymous
 Почему выбор.getComposeRanges() завершается с ошибкой типа в IOS

Сообщение Anonymous »

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

Код: Выделить всё

    this._root = root;
this._shadows = [];
let possibleShadow = this._root
while (possibleShadow !== document.body) {
if (possibleShadow.nodeType === 11) {
if(possibleShadow.host) {
this._shadows.push(possibleShadow);
possibleShadow = possibleShadow.host;
} else {
break;
}
} else {
possibleShadow = possibleShadow.parentNode;
}
}

Похоже, что это надежно предоставляет редактору список теневых корней в иерархии. Мне нужно это сделать, я пытался просто предоставить теневой корень выше this._root, но затем выборы вернули startContainer как элемент более высокого уровня в иерархии.
Редактор предоставляет метод (

Код: Выделить всё

getSelection
), к которому может обращаться код всего приложения, чтобы узнать, что выбрано в данный момент. Выглядит это так:-

Код: Выделить всё

getSelection() {

const selection = window.getSelection();

let range = document.createRange();

if (selection.rangeCount > 0) {
console.log('shadows length', this._shadows.length);
try {
const ranges = selection.getComposedRanges({shadowRoots: this._shadows})
console.log('got ranges length', ranges.length );
range.setStart(ranges[0].startContainer, ranges[0].startOffset);
range.setEnd(ranges[0].endContainer, ranges[0].endOffset);
console.log('get compsed range', range);
} catch(error) {
console.log ('errored in getComposedRanges with', error, 'stack', error.stack);
}
} else {
console.log('make new range for selection')
range.setStart(this._root,0);
range.setEnd(this._root, 0);

selection.setBaseAndExtent(
range.startContainer,
range.startOffset,
range.endContainer,
range.endOffset
);
}
return range;
}
}
Когда я запускаю это в IOS (iPad pro) с использованием Chrome с консольным журналом, записываемым chrome://inspect на следующей вкладке, я ясно вижу, что иногда (не всегда) выбор.getComposeRanges({shadowRoots: this._shadows}) выдает ошибку typeError. Я просмотрел спецификацию, но теперь могу найти утверждение, в котором говорится, что эта функция должна когда-либо ее выдавать.
Что здесь происходит? Что означает typeError?
(ПРИМЕЧАНИЕ. На рабочем столе Chrome под Linux все работает отлично)

Подробнее здесь: https://stackoverflow.com/questions/797 ... ror-on-ios
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «IOS»