Оновлення 2017 року
Оригінальна відповідь нижче передбачає, що OP хоче включати непустий текстовий вузол та інші типи вузлів, а також елементи. Зараз мені не здається зрозумілим із питання, чи є це вірним припущенням.
Якщо припустити, що ви просто хочете індекс елемента, previousElementSibling
він тепер добре підтримується (чого не було у 2012 році) і є очевидним вибором зараз. Наступне (що збігається з деякими іншими відповідями тут) буде працювати у всьому, крім IE <= 8.
function getElementIndex(node) {
var index = 0;
while ( (node = node.previousElementSibling) ) {
index++;
}
return index;
}
Оригінальна відповідь
Просто використовуйте, previousSibling
поки не вдарите null
. Я припускаю, що ви хочете ігнорувати текстові вузли, що містять лише пробіли; якщо ви хочете відфільтрувати інші вузли, налаштуйте відповідно.
function getNodeIndex(node) {
var index = 0;
while ( (node = node.previousSibling) ) {
if (node.nodeType != 3 || !/^\s*$/.test(node.data)) {
index++;
}
}
return index;
}