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:
3
js/bootstrap-modal.js
vendored
3
js/bootstrap-modal.js
vendored
@@ -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
88
js/bootstrap-scrollspy.js
vendored
Normal 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 )
|
68
js/tests/unit/bootstrap-modal.js
vendored
68
js/tests/unit/bootstrap-modal.js
vendored
@@ -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
31
js/tests/unit/bootstrap-scrollspy.js
vendored
Normal 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)
|
||||
})
|
||||
|
||||
})
|
Reference in New Issue
Block a user