Я пишу редактор веб-кода, где каждая строка представляет собой редактируемый контент div. Я написал собственный метод для установки позиции каретки по заданному индексу, но он работает только в хроме. opera и firefox всегда ставят каретку на начало линии.GWT set position on content editable div
public native void setCursorPos(int index) /*-{
//console.log(index);
var that = [email protected]::getElement()();
var position = index;
var el = that;
var treeWalker = document.createTreeWalker(el, NodeFilter.SHOW_TEXT,
function(el) {
return NodeFilter.FILTER_ACCEPT;
}, false);
while (treeWalker.nextNode()) {
if (position - treeWalker.currentNode.length <= 0) {
var range = document.createRange();
var sel = window.getSelection();
console.log(position);
range.setStart(treeWalker.currentNode, position);
range.setEnd(treeWalker.currentNode, position);
range.collapse(true);
sel.removeAllRanges();
sel.addRange(range);
el.focus();
return;
} else {
position = position - treeWalker.currentNode.length;
}
}
во время тестирования кода я использовал этот http://jsbin.com/EcETajo/5/edit и он работает в хром, далее и оперы.
Неправильная функция или что-то в генерации кода gwt с изменением каретки?
EDIT: им с помощью TreeWalker, потому что я хочу, чтобы обрабатывать текст hightlighting путем оборачивания текста в пролетных узлов в будущем
EDIT2: хорошо, ив нашел проблему самостоятельно.
var range = document.createRange(); var sel = window.getSelection();
эти строки были неправильными. js-код в gwt находится в iframe, поэтому для доступа к моим элементам html мне пришлось использовать что-то вроде этого var range = $ doc.createRange(); var sel = $ doc.getSelection(); порога $ док переменная устанавливается GWT
Пожалуйста, ответ на ваш вопрос с вашим решением и принять его. – Fedy2