任何获取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
答案 0 :(得分:2)
就像adeneo说的那样,这个似乎就像一个XY问题,但你真的需要一个解析器,我怀疑你是不是想写自己的。
一种可能性是使用原生.outerHTML
并对所有.length
节点的.previousSibling
求和,如果需要结束,则为当前.length
节点的总和位置。
但是,您应该知道这与原始HTML无关。这些将是在分析DOM的当前状态后由浏览器呈现的HTML字符串。
这是一个快速示例,它接收一个元素并返回开始(或可选地结束)位置:
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;