/* Native Javascript for Bootstrap 3 | ScrollSpy -----------------------------------------------*/ // SCROLLSPY DEFINITION // ==================== var ScrollSpy = function(element, options) { // initialization element, the element we spy on element = queryElement(element); // DATA API var targetData = queryElement(element[getAttribute](dataTarget)), offsetData = element[getAttribute]('data-offset'); // set options options = options || {}; // invalidate if ( !options[target] && !targetData ) { return; } // event targets, constants var self = this, spyTarget = options[target] && queryElement(options[target]) || targetData, links = spyTarget && spyTarget[getElementsByTagName]('A'), offset = parseInt(options['offset'] || offsetData) || 10, items = [], targetItems = [], scrollOffset, scrollTarget = element[offsetHeight] < element[scrollHeight] ? element : globalObject, // determine which is the real scrollTarget isWindow = scrollTarget === globalObject; // populate items and targets for (var i=0, il=links[length]; i= topEdge && bottomEdge > scrollOffset; if ( !isActive && inside ) { if ( parent.tagName === 'LI' && !hasClass(parent,active) ) { addClass(parent,active); if (dropdown && !hasClass(dropdown,active) ) { addClass(dropdown,active); } bootstrapCustomEvent.call(element, 'activate', 'scrollspy', items[index]); } } else if ( !inside ) { if ( parent.tagName === 'LI' && hasClass(parent,active) ) { removeClass(parent,active); if (dropdown && hasClass(dropdown,active) && !getElementsByClassName(parent[parentNode],active).length ) { removeClass(dropdown,active); } } } else if ( !inside && !isActive || isActive && inside ) { return; } }, updateItems = function(){ scrollOffset = isWindow ? getScroll().y : element[scrollTop]; for (var index=0, itl=items[length]; index