获取当前元素的字符串位置?

时间:2015-12-20 14:48:05

标签: javascript jquery html

任何获取jQuery选择元素相对于父元素的开头和结尾的“.indexOf()”字符串位置的方法吗?

示例:

<ul><li>Coffee</li><li>Coffee</li><li>Coffee</li></ul>

通过jquery选择第二个<li>项后,该函数将返回15(或带有参数切换的29)。

我正在考虑一个冗长的javascript解决方法,但它很快就变得讨厌和不可靠。如果其他标记类型或文本混合在一起,它也可能不起作用。坏。不要认真对待。

//http://stackoverflow.com/a/14482123
function nthIndex(str, pat, n){
    var L= str.length, i= -1;
    while(n-- && i++<L){
        i= str.indexOf(pat, i);
    }
    return i;
}

function strpos(jelem, tag) {
    var nth = jelem.index();
    var contents = jelem.parent().text();
    var pos = nthIndex(contents, tag, nth+1);
    if (tag.indexOf('/') == 1) {
        return pos+4; //because ending of '</li>' is +4 (very bad)
    } else {
        return pos;
    }
}

strpos(jelem, '<li>'); //or '</li>' to return the ending position

1 个答案:

答案 0 :(得分:2)

就像adeneo说的那样,这个似乎就像一个XY问题,但你真的需要一个解析器,我怀疑你是不是想写自己的。

一种可能性是使用原生.outerHTML并对所有.length节点的.previousSibling求和,如果需要结束,则为当前.length节点的总和位置。

但是,您应该知道这与原始HTML无关。这些将是在分析DOM的当前状态后由浏览器呈现的HTML字符串。

这是一个快速示例,它接收一个元素并返回开始(或可选地结束)位置:

&#13;
&#13;
function getPos(origElem, doEnding) {
  var sum = 0;
  var elem = origElem;

  while ((elem = elem.previousSibling)) {
    sum += elem.outerHTML.length;
  }

  if (doEnding) {
    sum += origElem.outerHTML.length-1;
  }
  return sum;
}

var li = document.querySelector("li:nth-child(2)");

var p = document.querySelector("pre");

p.textContent = "Position is: " + getPos(li);
p.textContent += "\nEnd position is: " + getPos(li, true);
&#13;
<ul><li>Coffee</li><li>Coffee</li><li>Coffee</li></ul>

<pre></pre>
&#13;
&#13;
&#13;