I read related posts, but didn't find a solution for IE, so I ask for a jQuery-solution for this problem:
I've some nested hierarchical Headings like this
<h1> heading 1</h1>
<h2> subheading 1</h2>
<h1> heading 2</h1>
<h2> subheading 1</h2>
<h2> subheading 2</h2>
I need some automated headings output like this:
1. heading 1
1.2 subheading 1
2. heading 2
2.1. subheading 1
2.2. subheading 2
Is there a way how this can be achieved using jQuery or alike, working in IE6+?
Here's my take on it:
var segments = [];
$(':header').each(function() {
var level = parseInt(this.nodeName.substring(1), 10);
if(segments.length == level) {
// from Hn to another Hn, just increment the last segment
segments[level-1]++;
} else if(segments.length > level) {
// from Hn to Hn-x, slice off the last x segments, and increment the last of the remaining
segments = segments.slice(0, level);
segments[level-1]++;
} else if(segments.length < level) {
// from Hn to Hn+x, (should always be Hn+1, but I'm doing some error checks anyway)
// add '1' x times.
for(var i = 0; i < (level-segments.length); i++) {
segments.push(1);
}
}
$(this).text(segments.join('.') + '. ' + $(this).text());
});
Working example on all levels, H1 - H6
another possibility
var indices = [];
function addIndex() {
// jQuery will give all the HNs in document order
jQuery('h1,h2,h3,h4,h5,h6').each(function(i,e) {
var hIndex = parseInt(this.nodeName.substring(1)) - 1;
// just found a levelUp event
if (indices.length - 1 > hIndex) {
indices= indices.slice(0, hIndex + 1 );
}
// just found a levelDown event
if (indices[hIndex] == undefined) {
indices[hIndex] = 0;
}
// count + 1 at current level
indices[hIndex]++;
// display the full position in the hierarchy
jQuery(this).prepend(indices.join(".")+" "+this.tagName);
});
}
jQuery(document).ready(function() {
addIndex();
});
honestor, simply speaking, the problem will be solved once we can get all the <h2>
tags that follows right after every <h1>
tag and just before the next <h1>
tag, right ?
This code has made it and working just fine
$("h1").each(function(mainHeadIndex)
{
// Numbering the main heads
$(this).html(mainHeadIndex +1 +'. ' + $(this).html());
// Find all the h2 tags right under this particular main head
$(this).nextUntil("h1").filter("h2").each(function(subIndex)
{
// calculate the right sub head number
var newSubIndex = subIndex+1;
// Numbering the sub heads
$(this).html(mainHeadIndex +1 +'.'+ newSubIndex +$(this).html());
});
})
you can test it on this link
P.S: thanks for you MatejB, I didn't know jsfiddle.com before your post :)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With