1
0
mirror of https://github.com/twbs/bootstrap.git synced 2025-08-24 14:13:06 +02:00

add bootstrap-scrollspy

This commit is contained in:
Jacob Thornton
2011-09-10 22:14:57 -07:00
parent a71d5d8e99
commit 64176caa97
8 changed files with 219 additions and 62 deletions

View File

@@ -59,6 +59,7 @@
this.isShown = true
_.escape.call(this)
_.backdrop.call(this, function () {
that.$element
.appendTo(document.body)
@@ -133,6 +134,8 @@
$.support.transition && this.$element.hasClass('fade')?
this.$backdrop.one(transitionEnd, removeElement) :
removeElement()
} else {
callback()
}
}

88
js/bootstrap-scrollspy.js vendored Normal file
View File

@@ -0,0 +1,88 @@
/* =============================================================
* bootstrap-scrollspy.js
* http://twitter.github.com/bootstrap/javascript.html#scrollspy
* =============================================================
* Copyright 2011 Twitter, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* ==============================================================
*/
!function ( $ ) {
var $window = $(window)
function ScrollSpy( topbar ) {
var processScroll = $.proxy(this.processScroll, this)
this.$topbar = $(topbar)
this.setup()
this.$topbar
.delegate('li > a', 'click', processScroll)
.bind('topbar:refresh', $.proxy(this.setup, this))
$window.scroll(processScroll)
this.processScroll()
}
ScrollSpy.prototype = {
setup: function () {
this.targets = this.$topbar.find('li > a').map(function () {
var href = $(this).attr('href')
return /^#\w/.test(href) && $(href).length ? href : null
})
this.offsets = $.map(this.targets, function (id) {
return $(id).offset().top
})
}
, processScroll: function () {
var scrollTop = $window.scrollTop() + 10
, offsets = this.offsets
, targets = this.targets
, activeTarget = this.activeTarget
, i
for (i = offsets.length; i--;) {
activeTarget != targets[i]
&& scrollTop >= offsets[i]
&& (!offsets[i + 1] || scrollTop <= offsets[i + 1])
&& this.activateButton( targets[i] )
}
}
, activateButton: function (target) {
this.activeTarget = target
this.$topbar
.find('.active')
.removeClass('active')
this.$topbar
.find('a[href=' + target + ']')
.parent('li')
.addClass('active')
}
}
/* SCROLLSPY PLUGIN DEFINITION
* =========================== */
$.fn.scrollSpy = function() {
return this.each(function () {
new ScrollSpy(this)
})
}
}( jQuery || ender )

View File

@@ -17,40 +17,70 @@ $(function () {
})
test("should insert into dom when modal:show event is called", function () {
stop()
$.support.transition = false
var div = $("<div id='modal-test'></div>")
div.modal().trigger("modal:show")
ok($('#modal-test').length, 'modal insterted into dom')
div.remove()
div
.modal()
.trigger("modal:show")
.bind("modal:shown", function () {
ok($('#modal-test').length, 'modal insterted into dom')
start()
div.remove()
})
})
test("should remove from dom when close is called", function () {
test("should remove from dom when modal:hide is called", function () {
stop()
$.support.transition = false
var div = $("<div id='modal-test'></div>")
div.modal().trigger("modal:show")
ok($('#modal-test').length, 'modal insterted into dom')
div.trigger("modal:hide")
ok(!$('#modal-test').length, 'modal removed from dom')
div.remove()
div
.modal()
.trigger("modal:show")
.bind("modal:shown", function () {
ok($('#modal-test').length, 'modal insterted into dom')
div.trigger("modal:hide")
})
.bind("modal:hidden", function() {
ok(!$('#modal-test').length, 'modal removed from dom')
start()
div.remove()
})
})
test("should toggle when toggle is called", function () {
stop()
$.support.transition = false
var div = $("<div id='modal-test'></div>")
div.modal().trigger("modal:toggle")
ok($('#modal-test').length, 'modal insterted into dom')
div.trigger("modal:toggle")
ok(!$('#modal-test').length, 'modal removed from dom')
div.remove()
div
.modal()
.trigger("modal:toggle")
.bind("modal:shown", function () {
ok($('#modal-test').length, 'modal insterted into dom')
div.trigger("modal:toggle")
})
.bind("modal:hidden", function() {
ok(!$('#modal-test').length, 'modal removed from dom')
start()
div.remove()
})
})
test("should remove from dom when click .close", function () {
stop()
$.support.transition = false
var div = $("<div id='modal-test'><span class='close'></span></div>")
div.modal().trigger("modal:toggle")
ok($('#modal-test').length, 'modal insterted into dom')
div.find('.close').click()
ok(!$('#modal-test').length, 'modal removed from dom')
div.remove()
div
.modal()
.trigger("modal:toggle")
.bind("modal:shown", function () {
ok($('#modal-test').length, 'modal insterted into dom')
div.find('.close').click()
})
.bind("modal:hidden", function() {
ok(!$('#modal-test').length, 'modal removed from dom')
start()
div.remove()
})
})
})

31
js/tests/unit/bootstrap-scrollspy.js vendored Normal file
View File

@@ -0,0 +1,31 @@
$(function () {
module("bootstrap-scrollspy")
test("should be defined on jquery object", function () {
ok($(document.body).scrollspy, 'scrollspy method is defined')
})
test("should return element", function () {
ok($(document.body).scrollspy()[0] == document.body, 'document.body returned')
})
test("should switch active class on scroll", function () {
var sectionHTML = '<div id="masthead"></div>'
, $section = $(sectionHTML).append('#qunit-runoff')
, topbarHTML ='<div class="topbar">'
+ '<div class="topbar-inner">'
+ '<div class="container">'
+ '<h3><a href="#">Bootstrap</a></h3>'
+ '<ul class="nav">'
+ '<li><a href="#masthead">Overview</a></li>'
+ '</ul>'
+ '</div>'
+ '</div>'
+ '</div>'
, $topbar = $(topbarHTML).topbar()
ok(topbar.find('.active', true)
})
})