1
0
Fork 0
mirror of https://github.com/twbs/bootstrap.git synced 2022-11-09 12:25:43 -05:00

Merge branch '2.1.0-wip' into 2.0.3-wip

Conflicts:
	docs/assets/bootstrap.zip
This commit is contained in:
Mark Otto 2012-03-23 18:29:21 -07:00
commit f87e4c60e9
19 changed files with 187 additions and 75 deletions

Binary file not shown.

View file

@ -27,7 +27,7 @@
var Carousel = function (element, options) { var Carousel = function (element, options) {
this.$element = $(element) this.$element = $(element)
this.options = $.extend({}, $.fn.carousel.defaults, options) this.options = options
this.options.slide && this.slide(this.options.slide) this.options.slide && this.slide(this.options.slide)
this.options.pause == 'hover' && this.$element this.options.pause == 'hover' && this.$element
.on('mouseenter', $.proxy(this.pause, this)) .on('mouseenter', $.proxy(this.pause, this))
@ -37,7 +37,8 @@
Carousel.prototype = { Carousel.prototype = {
cycle: function () { cycle: function () {
this.interval = setInterval($.proxy(this.next, this), this.options.interval) this.options.interval
&& (this.interval = setInterval($.proxy(this.next, this), this.options.interval))
return this return this
} }
@ -94,13 +95,7 @@
if ($next.hasClass('active')) return if ($next.hasClass('active')) return
if (!$.support.transition && this.$element.hasClass('slide')) { if ($.support.transition && this.$element.hasClass('slide')) {
this.$element.trigger('slide')
$active.removeClass('active')
$next.addClass('active')
this.sliding = false
this.$element.trigger('slid')
} else {
$next.addClass(type) $next.addClass(type)
$next[0].offsetWidth // force reflow $next[0].offsetWidth // force reflow
$active.addClass(direction) $active.addClass(direction)
@ -112,6 +107,12 @@
that.sliding = false that.sliding = false
setTimeout(function () { that.$element.trigger('slid') }, 0) setTimeout(function () { that.$element.trigger('slid') }, 0)
}) })
} else {
this.$element.trigger('slide')
$active.removeClass('active')
$next.addClass('active')
this.sliding = false
this.$element.trigger('slid')
} }
isCycling && this.cycle() isCycling && this.cycle()
@ -129,11 +130,11 @@
return this.each(function () { return this.each(function () {
var $this = $(this) var $this = $(this)
, data = $this.data('carousel') , data = $this.data('carousel')
, options = typeof option == 'object' && option , options = $.extend({}, $.fn.carousel.defaults, typeof option == 'object' && option)
if (!data) $this.data('carousel', (data = new Carousel(this, options))) if (!data) $this.data('carousel', (data = new Carousel(this, options)))
if (typeof option == 'number') data.to(option) if (typeof option == 'number') data.to(option)
else if (typeof option == 'string' || (option = options.slide)) data[option]() else if (typeof option == 'string' || (option = options.slide)) data[option]()
else data.cycle() else if (options.interval) data.cycle()
}) })
} }

View file

@ -42,11 +42,18 @@
} }
, show: function () { , show: function () {
var dimension = this.dimension() var dimension
, scroll = $.camelCase(['scroll', dimension].join('-')) , scroll
, actives = this.$parent && this.$parent.find('.in') , actives
, hasData , hasData
if (this.transitioning) return
dimension = this.dimension()
scroll = $.camelCase(['scroll', dimension].join('-'))
actives = this.$parent && this.$parent.find('> .accordion-group > .in')
hasData
if (actives && actives.length) { if (actives && actives.length) {
hasData = actives.data('collapse') hasData = actives.data('collapse')
actives.collapse('hide') actives.collapse('hide')
@ -56,11 +63,12 @@
this.$element[dimension](0) this.$element[dimension](0)
this.transition('addClass', 'show', 'shown') this.transition('addClass', 'show', 'shown')
this.$element[dimension](this.$element[0][scroll]) this.$element[dimension](this.$element[0][scroll])
} }
, hide: function () { , hide: function () {
var dimension = this.dimension() var dimension
if (this.transitioning) return
dimension = this.dimension()
this.reset(this.$element[dimension]()) this.reset(this.$element[dimension]())
this.transition('removeClass', 'hide', 'hidden') this.transition('removeClass', 'hide', 'hidden')
this.$element[dimension](0) this.$element[dimension](0)
@ -74,7 +82,7 @@
[dimension](size || 'auto') [dimension](size || 'auto')
[0].offsetWidth [0].offsetWidth
this.$element[size ? 'addClass' : 'removeClass']('collapse') this.$element[size != null ? 'addClass' : 'removeClass']('collapse')
return this return this
} }
@ -83,9 +91,12 @@
var that = this var that = this
, complete = function () { , complete = function () {
if (startEvent == 'show') that.reset() if (startEvent == 'show') that.reset()
that.transitioning = 0
that.$element.trigger(completeEvent) that.$element.trigger(completeEvent)
} }
this.transitioning = 1
this.$element this.$element
.trigger(startEvent) .trigger(startEvent)
[method]('in') [method]('in')

View file

@ -86,7 +86,9 @@
$(function () { $(function () {
$('html').on('click.dropdown.data-api', clearMenus) $('html').on('click.dropdown.data-api', clearMenus)
$('body').on('click.dropdown.data-api', toggle, Dropdown.prototype.toggle) $('body')
.on('click.dropdown', '.dropdown form', function (e) { e.stopPropagation() })
.on('click.dropdown.data-api', toggle, Dropdown.prototype.toggle)
}) })
}( window.jQuery ); }( window.jQuery );

View file

@ -38,8 +38,8 @@
, title = this.getTitle() , title = this.getTitle()
, content = this.getContent() , content = this.getContent()
$tip.find('.popover-title')[ $.type(title) == 'object' ? 'append' : 'html' ](title) $tip.find('.popover-title').html(title)
$tip.find('.popover-content > *')[ $.type(content) == 'object' ? 'append' : 'html' ](content) $tip.find('.popover-content > *').html(content)
$tip.removeClass('fade top bottom left right in') $tip.removeClass('fade top bottom left right in')
} }
@ -56,8 +56,6 @@
content = $e.attr('data-content') content = $e.attr('data-content')
|| (typeof o.content == 'function' ? o.content.call($e[0]) : o.content) || (typeof o.content == 'function' ? o.content.call($e[0]) : o.content)
content = content.toString().replace(/(^\s*|\s*$)/, "")
return content return content
} }

View file

@ -43,25 +43,42 @@
constructor: ScrollSpy constructor: ScrollSpy
, refresh: function () { , refresh: function () {
this.targets = this.$body var self = this
, $targets
this.offsets = []
this.targets = []
$targets = this.$body
.find(this.selector) .find(this.selector)
.map(function () { .map(function () {
var href = $(this).attr('href') var href = $(this).attr('href')
return /^#\w/.test(href) && $(href).length ? href : null , $href = /^#\w/.test(href) && $(href)
return ( $href
&& href.length
&& [[ $href.position().top, href ]] ) || null
})
.sort(function (a, b) { return a[0] - b[0] })
.each(function () {
self.offsets.push(this[0])
self.targets.push(this[1])
}) })
this.offsets = $.map(this.targets, function (id) {
return $(id).position().top
})
} }
, process: function () { , process: function () {
var scrollTop = this.$scrollElement.scrollTop() + this.options.offset var scrollTop = this.$scrollElement.scrollTop() + this.options.offset
, scrollHeight = this.$scrollElement[0].scrollHeight || this.$body[0].scrollHeight
, maxScroll = scrollHeight - this.$scrollElement.height()
, offsets = this.offsets , offsets = this.offsets
, targets = this.targets , targets = this.targets
, activeTarget = this.activeTarget , activeTarget = this.activeTarget
, i , i
if (scrollTop >= maxScroll) {
return activeTarget != (i = targets.last()[0])
&& this.activate ( i )
}
for (i = offsets.length; i--;) { for (i = offsets.length; i--;) {
activeTarget != targets[i] activeTarget != targets[i]
&& scrollTop >= offsets[i] && scrollTop >= offsets[i]
@ -85,8 +102,10 @@
.addClass('active') .addClass('active')
if ( active.parent('.dropdown-menu') ) { if ( active.parent('.dropdown-menu') ) {
active.closest('li.dropdown').addClass('active') active = active.closest('li.dropdown').addClass('active')
} }
active.trigger('activate')
} }
} }

View file

@ -73,8 +73,9 @@
if (!self.options.delay || !self.options.delay.show) { if (!self.options.delay || !self.options.delay.show) {
self.show() self.show()
} else { } else {
clearTimeout(this.timeout)
self.hoverState = 'in' self.hoverState = 'in'
setTimeout(function() { this.timeout = setTimeout(function() {
if (self.hoverState == 'in') { if (self.hoverState == 'in') {
self.show() self.show()
} }
@ -88,8 +89,9 @@
if (!self.options.delay || !self.options.delay.hide) { if (!self.options.delay || !self.options.delay.hide) {
self.hide() self.hide()
} else { } else {
clearTimeout(this.timeout)
self.hoverState = 'out' self.hoverState = 'out'
setTimeout(function() { this.timeout = setTimeout(function() {
if (self.hoverState == 'out') { if (self.hoverState == 'out') {
self.hide() self.hide()
} }
@ -206,8 +208,6 @@
title = $e.attr('data-original-title') title = $e.attr('data-original-title')
|| (typeof o.title == 'function' ? o.title.call($e[0]) : o.title) || (typeof o.title == 'function' ? o.title.call($e[0]) : o.title)
title = (title || '').toString().replace(/(^\s*|\s*$)/, "")
return title return title
} }

View file

@ -39,8 +39,9 @@
, select: function () { , select: function () {
var val = this.$menu.find('.active').attr('data-value') var val = this.$menu.find('.active').attr('data-value')
this.$element.val(val) this.$element
this.$element.change(); .val(val)
.change()
return this.hide() return this.hide()
} }
@ -109,7 +110,8 @@
} }
, highlighter: function (item) { , highlighter: function (item) {
return item.replace(new RegExp('(' + this.query + ')', 'ig'), function ($1, match) { var query = this.query.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, '\\$&')
return item.replace(new RegExp('(' + query + ')', 'ig'), function ($1, match) {
return '<strong>' + match + '</strong>' return '<strong>' + match + '</strong>'
}) })
} }

View file

@ -589,6 +589,21 @@ $('#myModal').on('hidden', function () {
</tr> </tr>
</tbody> </tbody>
</table> </table>
<h3>Events</h3>
<table class="table table-bordered table-striped">
<thead>
<tr>
<th style="width: 150px;">Event</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td>activate</td>
<td>This event fires whenever a new item becomes activated by the scrollspy.</td>
</tr>
</tbody>
</table>
</div> </div>
</div> </div>
</section> </section>
@ -1320,7 +1335,7 @@ $('#myCollapsible').on('hidden', function () {
<td>interval</td> <td>interval</td>
<td>number</td> <td>number</td>
<td>5000</td> <td>5000</td>
<td>The amount of time to delay between automatically cycling an item.</td> <td>The amount of time to delay between automatically cycling an item. If false, carousel will not automatically cycle.</td>
</tr> </tr>
<tr> <tr>
<td>pause</td> <td>pause</td>

View file

@ -513,6 +513,21 @@ $('#myModal').on('hidden', function () {
</tr> </tr>
</tbody> </tbody>
</table> </table>
<h3>{{_i}}Events{{/i}}</h3>
<table class="table table-bordered table-striped">
<thead>
<tr>
<th style="width: 150px;">{{_i}}Event{{/i}}</th>
<th>{{_i}}Description{{/i}}</th>
</tr>
</thead>
<tbody>
<tr>
<td>{{_i}}activate{{/i}}</td>
<td>{{_i}}This event fires whenever a new item becomes activated by the scrollspy.{{/i}}</td>
</tr>
</tbody>
</table>
</div> </div>
</div> </div>
</section> </section>
@ -1244,7 +1259,7 @@ $('#myCollapsible').on('hidden', function () {
<td>{{_i}}interval{{/i}}</td> <td>{{_i}}interval{{/i}}</td>
<td>{{_i}}number{{/i}}</td> <td>{{_i}}number{{/i}}</td>
<td>5000</td> <td>5000</td>
<td>{{_i}}The amount of time to delay between automatically cycling an item.{{/i}}</td> <td>{{_i}}The amount of time to delay between automatically cycling an item. If false, carousel will not automatically cycle.{{/i}}</td>
</tr> </tr>
<tr> <tr>
<td>{{_i}}pause{{/i}}</td> <td>{{_i}}pause{{/i}}</td>

View file

@ -27,7 +27,7 @@
var Carousel = function (element, options) { var Carousel = function (element, options) {
this.$element = $(element) this.$element = $(element)
this.options = $.extend({}, $.fn.carousel.defaults, options) this.options = options
this.options.slide && this.slide(this.options.slide) this.options.slide && this.slide(this.options.slide)
this.options.pause == 'hover' && this.$element this.options.pause == 'hover' && this.$element
.on('mouseenter', $.proxy(this.pause, this)) .on('mouseenter', $.proxy(this.pause, this))
@ -37,7 +37,8 @@
Carousel.prototype = { Carousel.prototype = {
cycle: function () { cycle: function () {
this.interval = setInterval($.proxy(this.next, this), this.options.interval) this.options.interval
&& (this.interval = setInterval($.proxy(this.next, this), this.options.interval))
return this return this
} }
@ -94,13 +95,7 @@
if ($next.hasClass('active')) return if ($next.hasClass('active')) return
if (!$.support.transition && this.$element.hasClass('slide')) { if ($.support.transition && this.$element.hasClass('slide')) {
this.$element.trigger('slide')
$active.removeClass('active')
$next.addClass('active')
this.sliding = false
this.$element.trigger('slid')
} else {
$next.addClass(type) $next.addClass(type)
$next[0].offsetWidth // force reflow $next[0].offsetWidth // force reflow
$active.addClass(direction) $active.addClass(direction)
@ -112,6 +107,12 @@
that.sliding = false that.sliding = false
setTimeout(function () { that.$element.trigger('slid') }, 0) setTimeout(function () { that.$element.trigger('slid') }, 0)
}) })
} else {
this.$element.trigger('slide')
$active.removeClass('active')
$next.addClass('active')
this.sliding = false
this.$element.trigger('slid')
} }
isCycling && this.cycle() isCycling && this.cycle()
@ -129,11 +130,11 @@
return this.each(function () { return this.each(function () {
var $this = $(this) var $this = $(this)
, data = $this.data('carousel') , data = $this.data('carousel')
, options = typeof option == 'object' && option , options = $.extend({}, $.fn.carousel.defaults, typeof option == 'object' && option)
if (!data) $this.data('carousel', (data = new Carousel(this, options))) if (!data) $this.data('carousel', (data = new Carousel(this, options)))
if (typeof option == 'number') data.to(option) if (typeof option == 'number') data.to(option)
else if (typeof option == 'string' || (option = options.slide)) data[option]() else if (typeof option == 'string' || (option = options.slide)) data[option]()
else data.cycle() else if (options.interval) data.cycle()
}) })
} }

View file

@ -42,11 +42,18 @@
} }
, show: function () { , show: function () {
var dimension = this.dimension() var dimension
, scroll = $.camelCase(['scroll', dimension].join('-')) , scroll
, actives = this.$parent && this.$parent.find('.in') , actives
, hasData , hasData
if (this.transitioning) return
dimension = this.dimension()
scroll = $.camelCase(['scroll', dimension].join('-'))
actives = this.$parent && this.$parent.find('> .accordion-group > .in')
hasData
if (actives && actives.length) { if (actives && actives.length) {
hasData = actives.data('collapse') hasData = actives.data('collapse')
actives.collapse('hide') actives.collapse('hide')
@ -56,11 +63,12 @@
this.$element[dimension](0) this.$element[dimension](0)
this.transition('addClass', 'show', 'shown') this.transition('addClass', 'show', 'shown')
this.$element[dimension](this.$element[0][scroll]) this.$element[dimension](this.$element[0][scroll])
} }
, hide: function () { , hide: function () {
var dimension = this.dimension() var dimension
if (this.transitioning) return
dimension = this.dimension()
this.reset(this.$element[dimension]()) this.reset(this.$element[dimension]())
this.transition('removeClass', 'hide', 'hidden') this.transition('removeClass', 'hide', 'hidden')
this.$element[dimension](0) this.$element[dimension](0)
@ -74,7 +82,7 @@
[dimension](size || 'auto') [dimension](size || 'auto')
[0].offsetWidth [0].offsetWidth
this.$element[size ? 'addClass' : 'removeClass']('collapse') this.$element[size != null ? 'addClass' : 'removeClass']('collapse')
return this return this
} }
@ -83,9 +91,12 @@
var that = this var that = this
, complete = function () { , complete = function () {
if (startEvent == 'show') that.reset() if (startEvent == 'show') that.reset()
that.transitioning = 0
that.$element.trigger(completeEvent) that.$element.trigger(completeEvent)
} }
this.transitioning = 1
this.$element this.$element
.trigger(startEvent) .trigger(startEvent)
[method]('in') [method]('in')

View file

@ -86,7 +86,9 @@
$(function () { $(function () {
$('html').on('click.dropdown.data-api', clearMenus) $('html').on('click.dropdown.data-api', clearMenus)
$('body').on('click.dropdown.data-api', toggle, Dropdown.prototype.toggle) $('body')
.on('click.dropdown', '.dropdown form', function (e) { e.stopPropagation() })
.on('click.dropdown.data-api', toggle, Dropdown.prototype.toggle)
}) })
}( window.jQuery ); }( window.jQuery );

View file

@ -38,8 +38,8 @@
, title = this.getTitle() , title = this.getTitle()
, content = this.getContent() , content = this.getContent()
$tip.find('.popover-title')[ $.type(title) == 'object' ? 'append' : 'html' ](title) $tip.find('.popover-title').html(title)
$tip.find('.popover-content > *')[ $.type(content) == 'object' ? 'append' : 'html' ](content) $tip.find('.popover-content > *').html(content)
$tip.removeClass('fade top bottom left right in') $tip.removeClass('fade top bottom left right in')
} }
@ -56,8 +56,6 @@
content = $e.attr('data-content') content = $e.attr('data-content')
|| (typeof o.content == 'function' ? o.content.call($e[0]) : o.content) || (typeof o.content == 'function' ? o.content.call($e[0]) : o.content)
content = content.toString().replace(/(^\s*|\s*$)/, "")
return content return content
} }

View file

@ -43,25 +43,42 @@
constructor: ScrollSpy constructor: ScrollSpy
, refresh: function () { , refresh: function () {
this.targets = this.$body var self = this
, $targets
this.offsets = []
this.targets = []
$targets = this.$body
.find(this.selector) .find(this.selector)
.map(function () { .map(function () {
var href = $(this).attr('href') var href = $(this).attr('href')
return /^#\w/.test(href) && $(href).length ? href : null , $href = /^#\w/.test(href) && $(href)
return ( $href
&& href.length
&& [[ $href.position().top, href ]] ) || null
})
.sort(function (a, b) { return a[0] - b[0] })
.each(function () {
self.offsets.push(this[0])
self.targets.push(this[1])
}) })
this.offsets = $.map(this.targets, function (id) {
return $(id).position().top
})
} }
, process: function () { , process: function () {
var scrollTop = this.$scrollElement.scrollTop() + this.options.offset var scrollTop = this.$scrollElement.scrollTop() + this.options.offset
, scrollHeight = this.$scrollElement[0].scrollHeight || this.$body[0].scrollHeight
, maxScroll = scrollHeight - this.$scrollElement.height()
, offsets = this.offsets , offsets = this.offsets
, targets = this.targets , targets = this.targets
, activeTarget = this.activeTarget , activeTarget = this.activeTarget
, i , i
if (scrollTop >= maxScroll) {
return activeTarget != (i = targets.last()[0])
&& this.activate ( i )
}
for (i = offsets.length; i--;) { for (i = offsets.length; i--;) {
activeTarget != targets[i] activeTarget != targets[i]
&& scrollTop >= offsets[i] && scrollTop >= offsets[i]
@ -85,8 +102,10 @@
.addClass('active') .addClass('active')
if ( active.parent('.dropdown-menu') ) { if ( active.parent('.dropdown-menu') ) {
active.closest('li.dropdown').addClass('active') active = active.closest('li.dropdown').addClass('active')
} }
active.trigger('activate')
} }
} }

View file

@ -73,8 +73,9 @@
if (!self.options.delay || !self.options.delay.show) { if (!self.options.delay || !self.options.delay.show) {
self.show() self.show()
} else { } else {
clearTimeout(this.timeout)
self.hoverState = 'in' self.hoverState = 'in'
setTimeout(function() { this.timeout = setTimeout(function() {
if (self.hoverState == 'in') { if (self.hoverState == 'in') {
self.show() self.show()
} }
@ -88,8 +89,9 @@
if (!self.options.delay || !self.options.delay.hide) { if (!self.options.delay || !self.options.delay.hide) {
self.hide() self.hide()
} else { } else {
clearTimeout(this.timeout)
self.hoverState = 'out' self.hoverState = 'out'
setTimeout(function() { this.timeout = setTimeout(function() {
if (self.hoverState == 'out') { if (self.hoverState == 'out') {
self.hide() self.hide()
} }
@ -206,8 +208,6 @@
title = $e.attr('data-original-title') title = $e.attr('data-original-title')
|| (typeof o.title == 'function' ? o.title.call($e[0]) : o.title) || (typeof o.title == 'function' ? o.title.call($e[0]) : o.title)
title = (title || '').toString().replace(/(^\s*|\s*$)/, "")
return title return title
} }

View file

@ -39,8 +39,9 @@
, select: function () { , select: function () {
var val = this.$menu.find('.active').attr('data-value') var val = this.$menu.find('.active').attr('data-value')
this.$element.val(val) this.$element
this.$element.change(); .val(val)
.change()
return this.hide() return this.hide()
} }
@ -109,7 +110,8 @@
} }
, highlighter: function (item) { , highlighter: function (item) {
return item.replace(new RegExp('(' + this.query + ')', 'ig'), function ($1, match) { var query = this.query.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, '\\$&')
return item.replace(new RegExp('(' + query + ')', 'ig'), function ($1, match) {
return '<strong>' + match + '</strong>' return '<strong>' + match + '</strong>'
}) })
} }

View file

@ -36,7 +36,7 @@
<script src="unit/bootstrap-tooltip.js"></script> <script src="unit/bootstrap-tooltip.js"></script>
<script src="unit/bootstrap-popover.js"></script> <script src="unit/bootstrap-popover.js"></script>
<script src="unit/bootstrap-typeahead.js"></script> <script src="unit/bootstrap-typeahead.js"></script>
</head>
<body> <body>
<div> <div>
<h1 id="qunit-header">Bootstrap Plugin Test Suite</h1> <h1 id="qunit-header">Bootstrap Plugin Test Suite</h1>

View file

@ -52,6 +52,22 @@ $(function () {
typeahead.$menu.remove() typeahead.$menu.remove()
}) })
test("should not explode when regex chars are entered", function () {
var $input = $('<input />').typeahead({
source: ['aa', 'ab', 'ac', 'mdo*', 'fat+']
})
, typeahead = $input.data('typeahead')
$input.val('+')
typeahead.lookup()
ok(typeahead.$menu.is(":visible"), 'typeahead is visible')
equals(typeahead.$menu.find('li').length, 1, 'has 1 item in menu')
equals(typeahead.$menu.find('.active').length, 1, 'one item is active')
typeahead.$menu.remove()
})
test("should hide menu when query entered", function () { test("should hide menu when query entered", function () {
stop() stop()
var $input = $('<input />').typeahead({ var $input = $('<input />').typeahead({