在innerHTML中找到innerText索引?

时间:2019-02-25 14:05:10

标签: javascript html

假设其中一个元素是innerHTML和innerText:

innerHTML = <span>Hello</span><br><span>World!</span>
innerText = Hello \n World!

假设我有一个索引号。 (或一组用于子字符串的)innerText说1('e')(或1:2子字符串),我如何才能在innerHTML.ie中找到此特定'e'的索引,即转换此innertext索引到其innerHTML索引,在这种情况下为1(1:2)至7(7:8)。

现在我有一个想法可以执行此操作,但是我不知道它是否有效。这是我的概念:

在函数textIndexToHTMLIndex(startIndex, endIndex, innerText, innerHTML)中说,我们发现startIndex和endIndex之间的字符串是哪个重复字符串,例如textIndexToHTMLIndex(4,8,"<lol<lol"),要搜索的字符串是第二个字符串(尽管程序不知道还没有)"<lol"(我们不包括最后一个索引)。现在,在找到它的出现之后,我们将其转换为HTML文本,例如<lol变成&lt;lol

执行完此操作后,我们在innerHTML中发现了与该字符串相同的新值,因此,如果<lol的ences_finder返回“ 2”,我们将在innerHTML中发现&lt;lol的第二次出现并返回它是索引的。当然,在执行此操作时,我们必须忽略标签。

希望对于这样的函数来说这是一个足够好的模板,但是如果您不喜欢它并有其他解决方案,请随时回答。至于我为什么需要它-我正在使用它来语法化div中来自ESpree的标记。

编辑

忘记提及这一点,但是我尝试制作模板,并被卡在忽略标签的部分,这是到目前为止的代码,尽管我将其用于语法突出显示,但我需要以不同的方式进行处理:

function getIndicesOf(searchStr, str, caseSensitive) {
    var searchStrLen = searchStr.length;
    if (searchStrLen == 0) {
        return [];
    }
    var startIndex = 0, index, indices = [];
    if (!caseSensitive) {
        str = str.toLowerCase();
        searchStr = searchStr.toLowerCase();
    }
    while ((index = str.indexOf(searchStr, startIndex)) > -1) {
        indices.push(index);
        startIndex = index + searchStrLen;
    }
    return indices;
}

function htmlEntities(str) {
    return String(str).replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/\"/g, '&quot;');
}
function textIndexToHTMLIndex(startIndex, endIndex, innerText, innerHTML){
    var stringToSearch = innerText.substring(startIndex, endIndex);
    var occurencesInInnerHTML = getIndicesOf(innerText, stringToSearch, true);
    var whichOccurence = occurencesInInnerHTML.indexOf(startIndex);
    var stringToSearchInHTML = htmlEntities(stringToSearch);
    //Here is where I want to keep a for loop which cycles every char except everything including and between < and >
}

1 个答案:

答案 0 :(得分:0)

好的,我终于做到了!!!这是完成的功能:

function textIndexToHTMLIndex(startIndex, endIndex, innerText, innerHTML){
    var stringToSearch       = innerText.substring(startIndex, endIndex);
    var occurInInnerText     = getIndicesOf(stringToSearch, innerText, true);
    var whichOccurence       = occurInInnerText.indexOf(startIndex);
    var stringToSearchInHTML = stringToSearch.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/"/g, '&quot;').replace(/\n/g, '<br>');
    var occurencesInHTML     = [];
    var isChecking           = true;
    for(var i = 0; i < innerHTML.length;i++){
        if(stringToSearchInHTML==stringToSearch){
            if(innerHTML.charAt(i)=='<'||innerHTML.charAt(i)=='&'){
                isChecking = false;
            }else if(innerHTML.charAt(i-1)=='>'||innerHTML.charAt(i-1)==';'){
                isChecking = true;
            }

        }else{
            if(innerHTML.charAt(i)=='<'){
                isChecking = false;
            }else if(innerHTML.charAt(i-1)=='>'){
                isChecking = true;
            }
        }
        if(isChecking){
            if(innerHTML.substring(i,i+stringToSearchInHTML.length)==stringToSearchInHTML){
                    occurencesInHTML.push(i);
            }
        }
    }
    startIndexInHTML = occurencesInHTML[whichOccurence];
    endIndexInHTML   = startIndexInHTML+stringToSearchInHTML.length;
    return [startIndexInHTML, endIndexInHTML];
}

getIndicesOf函数是有问题的。