Возможно, вы могли бы сделать это, получив innerHTML
, изменив символ, смещение которого вы ищете, а затем повторно проанализировав и расшифровав результирующие текстовые узлы, чтобы найти тот, где закончилось изменение data
.
например.
function findTextFromMarkupIndex(el1, ix) {
// make comparison element
var el2= document.createElement(el1.tagName);
// replace any other use of * in its HTML out of the way
var html= el1.innerHTML.split('*').join('x');
// insert a * at the given index in HTML
el2.innerHTML= html.substring(0, ix)+'*'+html.substring(ix);
// search the resulting DOM for the * and return the matching descandent from the original
return findTextInComparison(el1, el2, '*');
}
function findTextInComparison(el1, el2, text) {
for (var i= 0; i<el1.childNodes.length; i++) {
var child1= el1.childNodes[i];
var child2= el2.childNodes[i];
if (child2.nodeType===3) { // TEXT_NODE
var ix= child2.data.indexOf(text);
if (ix!==-1)
return [child1, ix];
} else if (child2.nodeType===1) { // ELEMENT_NODE
var result= findTextInComparison(child1, child2, text);
if (result!==null)
return result;
}
}
return null;
}
Не проверено, но должно работать, для символов в текстовом содержимом в любом случае. Вы можете расширить его, чтобы также заглянуть внутрь значений атрибутов, если вам это необходимо, но вы не можете делать индексные точки внутри разметки, такие как ссылка на элемент или сущность / символ. Чтобы это работало, вам, по сути, нужно написать целый HTML-парсер.
Это звучит как необычное требование, что именно вы пытаетесь сделать? Индексы в innerHTML
могут быть довольно хрупкими, поскольку точный формат вывода разметки для этого свойства вообще не стандартизирован.