diff options
| author | Mark Otto <[email protected]> | 2013-01-13 04:26:52 -0800 |
|---|---|---|
| committer | Mark Otto <[email protected]> | 2013-01-13 04:26:52 -0800 |
| commit | 7d8d5c783815d83bddc6969052f1600c45246d57 (patch) | |
| tree | 68378feaf630e4b670118b85dc7fb57501fcca9d /js | |
| parent | 76ed6b0b2ced6a29c5cb7b6ea62d0c738dbbd90a (diff) | |
| parent | 4b34f4947aedc0e8539eee779e3921f44e0bca8b (diff) | |
| download | bootstrap-7d8d5c783815d83bddc6969052f1600c45246d57.tar.xz bootstrap-7d8d5c783815d83bddc6969052f1600c45246d57.zip | |
Merge branch '2.3.0-wip' into 3.0.0-wip
Conflicts:
Makefile
README.md
component.json
docs/assets/css/bootstrap-responsive.css
docs/assets/css/bootstrap.css
docs/assets/js/bootstrap-affix.js
docs/assets/js/bootstrap-alert.js
docs/assets/js/bootstrap-button.js
docs/assets/js/bootstrap-carousel.js
docs/assets/js/bootstrap-collapse.js
docs/assets/js/bootstrap-dropdown.js
docs/assets/js/bootstrap-modal.js
docs/assets/js/bootstrap-popover.js
docs/assets/js/bootstrap-scrollspy.js
docs/assets/js/bootstrap-tab.js
docs/assets/js/bootstrap-tooltip.js
docs/assets/js/bootstrap-transition.js
docs/assets/js/bootstrap-typeahead.js
docs/assets/js/bootstrap.js
docs/components.html
docs/css.html
docs/examples/fluid.html
docs/extend.html
docs/getting-started.html
docs/index.html
docs/templates/pages/base-css.mustache
docs/templates/pages/components.mustache
docs/templates/pages/extend.mustache
docs/templates/pages/getting-started.mustache
docs/templates/pages/index.mustache
docs/templates/pages/javascript.mustache
js/bootstrap-affix.js
js/bootstrap-alert.js
js/bootstrap-button.js
js/bootstrap-carousel.js
js/bootstrap-collapse.js
js/bootstrap-dropdown.js
js/bootstrap-modal.js
js/bootstrap-popover.js
js/bootstrap-scrollspy.js
js/bootstrap-tab.js
js/bootstrap-tooltip.js
js/bootstrap-transition.js
js/bootstrap-typeahead.js
less/bootstrap.less
less/buttons.less
less/forms.less
less/navbar.less
less/popovers.less
less/responsive-767px-max.less
less/responsive.less
less/tables.less
less/tooltip.less
less/type.less
less/variables.less
package.json
Diffstat (limited to 'js')
| -rw-r--r-- | js/bootstrap-carousel.js | 10 | ||||
| -rw-r--r-- | js/bootstrap-collapse.js | 2 | ||||
| -rw-r--r-- | js/bootstrap-dropdown.js | 7 | ||||
| -rw-r--r-- | js/bootstrap-popover.js | 2 | ||||
| -rw-r--r-- | js/bootstrap-scrollspy.js | 2 | ||||
| -rw-r--r-- | js/bootstrap-tooltip.js | 45 | ||||
| -rw-r--r-- | js/bootstrap-typeahead.js | 1 | ||||
| -rw-r--r-- | js/tests/unit/bootstrap-carousel.js | 12 | ||||
| -rw-r--r-- | js/tests/unit/bootstrap-tooltip.js | 97 | ||||
| -rw-r--r-- | js/tests/unit/bootstrap-typeahead.js | 5 |
10 files changed, 164 insertions, 19 deletions
diff --git a/js/bootstrap-carousel.js b/js/bootstrap-carousel.js index d9c580e85..fad16def2 100644 --- a/js/bootstrap-carousel.js +++ b/js/bootstrap-carousel.js @@ -108,6 +108,7 @@ e = $.Event('slide', { relatedTarget: $next[0] + , direction: direction }) if ($next.hasClass('active')) return @@ -187,11 +188,18 @@ /* CAROUSEL DATA-API * ================= */ - $(document).on('click.carousel.data-api', '[data-slide]', function (e) { + $(document).on('click.carousel.data-api', '[data-slide], [data-slide-to]', function (e) { var $this = $(this), href , $target = $($this.attr('data-target') || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) //strip for ie7 , options = $.extend({}, $target.data(), $this.data()) + , slideIndex + $target.carousel(options) + + if (slideIndex = $this.attr('data-slide-to')) { + $target.data('carousel').pause().to(slideIndex).cycle() + } + e.preventDefault() }) diff --git a/js/bootstrap-collapse.js b/js/bootstrap-collapse.js index 48dea44c4..e1d5a856e 100644 --- a/js/bootstrap-collapse.js +++ b/js/bootstrap-collapse.js @@ -129,7 +129,7 @@ return this.each(function () { var $this = $(this) , data = $this.data('collapse') - , options = typeof option == 'object' && option + , options = $.extend({}, $.fn.collapse.defaults, $this.data(), typeof option == 'object' && option) if (!data) $this.data('collapse', (data = new Collapse(this, options))) if (typeof option == 'string') data[option]() }) diff --git a/js/bootstrap-dropdown.js b/js/bootstrap-dropdown.js index 93d645970..37819e361 100644 --- a/js/bootstrap-dropdown.js +++ b/js/bootstrap-dropdown.js @@ -81,7 +81,10 @@ isActive = $parent.hasClass('open') - if (!isActive || (isActive && e.keyCode == 27)) return $this.click() + if (!isActive || (isActive && e.keyCode == 27)) { + if (e.which == 27) $parent.find(toggle).focus() + return $this.click() + } $items = $('[role=menu] li:not(.divider):visible a', $parent) @@ -154,7 +157,7 @@ $(document) .on('click.dropdown.data-api touchstart.dropdown.data-api', clearMenus) - .on('click.dropdown touchstart.dropdown.data-api', '.dropdown form', function (e) { e.stopPropagation() }) + .on('click.dropdown.data-api touchstart.dropdown.data-api', '.dropdown form', function (e) { e.stopPropagation() }) .on('touchstart.dropdown.data-api', '.dropdown-menu', function (e) { e.stopPropagation() }) .on('click.dropdown.data-api touchstart.dropdown.data-api' , toggle, Dropdown.prototype.toggle) .on('keydown.dropdown.data-api touchstart.dropdown.data-api', toggle + ', [role=menu]' , Dropdown.prototype.keydown) diff --git a/js/bootstrap-popover.js b/js/bootstrap-popover.js index dc639a63e..4480c6cb6 100644 --- a/js/bootstrap-popover.js +++ b/js/bootstrap-popover.js @@ -99,7 +99,7 @@ placement: 'right' , trigger: 'click' , content: '' - , template: '<div class="popover"><div class="arrow"></div><div class="popover-inner"><h3 class="popover-title"></h3><div class="popover-content"></div></div></div>' + , template: '<div class="popover"><div class="arrow"></div><h3 class="popover-title"></h3><div class="popover-content"></div></div>' }) diff --git a/js/bootstrap-scrollspy.js b/js/bootstrap-scrollspy.js index b61c33006..7e845a513 100644 --- a/js/bootstrap-scrollspy.js +++ b/js/bootstrap-scrollspy.js @@ -59,7 +59,7 @@ , $href = /^#\w/.test(href) && $(href) return ( $href && $href.length - && [[ $href.position().top + self.$scrollElement.scrollTop(), href ]] ) || null + && [[ $href.position().top + (!$.isWindow(self.$scrollElement.get(0)) && self.$scrollElement.scrollTop()), href ]] ) || null }) .sort(function (a, b) { return a[0] - b[0] }) .each(function () { diff --git a/js/bootstrap-tooltip.js b/js/bootstrap-tooltip.js index bbb532776..d57cd9d7f 100644 --- a/js/bootstrap-tooltip.js +++ b/js/bootstrap-tooltip.js @@ -38,19 +38,27 @@ , init: function (type, element, options) { var eventIn , eventOut + , triggers + , trigger + , i this.type = type this.$element = $(element) this.options = this.getOptions(options) this.enabled = true - if (this.options.trigger == 'click') { - this.$element.on('click.' + this.type, this.options.selector, $.proxy(this.toggle, this)) - } else if (this.options.trigger != 'manual') { - eventIn = this.options.trigger == 'hover' ? 'mouseenter' : 'focus' - eventOut = this.options.trigger == 'hover' ? 'mouseleave' : 'blur' - this.$element.on(eventIn + '.' + this.type, this.options.selector, $.proxy(this.enter, this)) - this.$element.on(eventOut + '.' + this.type, this.options.selector, $.proxy(this.leave, this)) + triggers = this.options.trigger.split(' ') + + for (i = triggers.length; i--;) { + trigger = triggers[i] + if (trigger == 'click') { + this.$element.on('click.' + this.type, this.options.selector, $.proxy(this.toggle, this)) + } else if (trigger != 'manual') { + eventIn = trigger == 'hover' ? 'mouseenter' : 'focus' + eventOut = trigger == 'hover' ? 'mouseleave' : 'blur' + this.$element.on(eventIn + '.' + this.type, this.options.selector, $.proxy(this.enter, this)) + this.$element.on(eventOut + '.' + this.type, this.options.selector, $.proxy(this.leave, this)) + } } this.options.selector ? @@ -102,8 +110,11 @@ , actualHeight , placement , tp + , e = $.Event('show') if (this.hasContent() && this.enabled) { + this.$element.trigger(e) + if (e.isDefaultPrevented()) return $tip = this.tip() this.setContent() @@ -118,7 +129,8 @@ $tip .detach() .css({ top: 0, left: 0, display: 'block' }) - .insertAfter(this.$element) + + this.options.container ? $tip.appendTo(this.options.container) : $tip.insertAfter(this.$element) pos = this.getPosition() @@ -144,6 +156,8 @@ .offset(tp) .addClass(placement) .addClass('in') + + this.$element.trigger('shown') } } @@ -158,6 +172,10 @@ , hide: function () { var that = this , $tip = this.tip() + , e = $.Event('hide') + + this.$element.trigger(e) + if (e.isDefaultPrevented()) return $tip.removeClass('in') @@ -176,6 +194,8 @@ removeWithAnimation() : $tip.detach() + this.$element.trigger('hidden') + return this } @@ -234,8 +254,8 @@ } , toggle: function (e) { - var self = $(e.currentTarget)[this.type](this._options).data(this.type) - self[self.tip().hasClass('in') ? 'hide' : 'show']() + var self = e ? $(e.currentTarget)[this.type](this._options).data(this.type) : this + self.tip().hasClass('in') ? self.hide() : self.show() } , destroy: function () { @@ -267,10 +287,11 @@ , placement: 'top' , selector: false , template: '<div class="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>' - , trigger: 'hover' + , trigger: 'hover focus' , title: '' , delay: 0 , html: false + , container: false } @@ -282,4 +303,4 @@ return this } -}(window.jQuery);
\ No newline at end of file +}(window.jQuery); diff --git a/js/bootstrap-typeahead.js b/js/bootstrap-typeahead.js index 609be260c..8624bc7bc 100644 --- a/js/bootstrap-typeahead.js +++ b/js/bootstrap-typeahead.js @@ -271,6 +271,7 @@ e.stopPropagation() e.preventDefault() this.select() + this.$element.focus() } , mouseenter: function (e) { diff --git a/js/tests/unit/bootstrap-carousel.js b/js/tests/unit/bootstrap-carousel.js index 13b8f721f..80b6e139b 100644 --- a/js/tests/unit/bootstrap-carousel.js +++ b/js/tests/unit/bootstrap-carousel.js @@ -31,6 +31,18 @@ $(function () { .carousel('next') }) + test("should fire slide event with direction", function () { + var template = '<div id="myCarousel" class="carousel slide"><div class="carousel-inner"><div class="item active"><img alt=""><div class="carousel-caption"><h4>{{_i}}First Thumbnail label{{/i}}</h4><p>Cras justo odio, dapibus ac facilisis in, egestas eget quam. Donec id elit non mi porta gravida at eget metus. Nullam id dolor id nibh ultricies vehicula ut id elit.</p></div></div><div class="item"><img alt=""><div class="carousel-caption"><h4>{{_i}}Second Thumbnail label{{/i}}</h4><p>Cras justo odio, dapibus ac facilisis in, egestas eget quam. Donec id elit non mi porta gravida at eget metus. Nullam id dolor id nibh ultricies vehicula ut id elit.</p></div></div><div class="item"><img alt=""><div class="carousel-caption"><h4>{{_i}}Third Thumbnail label{{/i}}</h4><p>Cras justo odio, dapibus ac facilisis in, egestas eget quam. Donec id elit non mi porta gravida at eget metus. Nullam id dolor id nibh ultricies vehicula ut id elit.</p></div></div></div><a class="left carousel-control" href="#myCarousel" data-slide="prev">‹</a><a class="right carousel-control" href="#myCarousel" data-slide="next">›</a></div>' + $.support.transition = false + stop() + $(template).on('slide', function (e) { + e.preventDefault() + ok(e.direction) + ok(e.direction === 'right' || e.direction === 'left') + start() + }).carousel('next') + }) + test("should fire slide event with relatedTarget", function () { var template = '<div id="myCarousel" class="carousel slide"><div class="carousel-inner"><div class="item active"><img alt=""><div class="carousel-caption"><h4>{{_i}}First Thumbnail label{{/i}}</h4><p>Cras justo odio, dapibus ac facilisis in, egestas eget quam. Donec id elit non mi porta gravida at eget metus. Nullam id dolor id nibh ultricies vehicula ut id elit.</p></div></div><div class="item"><img alt=""><div class="carousel-caption"><h4>{{_i}}Second Thumbnail label{{/i}}</h4><p>Cras justo odio, dapibus ac facilisis in, egestas eget quam. Donec id elit non mi porta gravida at eget metus. Nullam id dolor id nibh ultricies vehicula ut id elit.</p></div></div><div class="item"><img alt=""><div class="carousel-caption"><h4>{{_i}}Third Thumbnail label{{/i}}</h4><p>Cras justo odio, dapibus ac facilisis in, egestas eget quam. Donec id elit non mi porta gravida at eget metus. Nullam id dolor id nibh ultricies vehicula ut id elit.</p></div></div></div><a class="left carousel-control" href="#myCarousel" data-slide="prev">‹</a><a class="right carousel-control" href="#myCarousel" data-slide="next">›</a></div>' $.support.transition = false diff --git a/js/tests/unit/bootstrap-tooltip.js b/js/tests/unit/bootstrap-tooltip.js index ba5134743..ef21bd96b 100644 --- a/js/tests/unit/bootstrap-tooltip.js +++ b/js/tests/unit/bootstrap-tooltip.js @@ -66,6 +66,83 @@ $(function () { ok(!$(".tooltip").length, 'tooltip removed') }) + test("should fire show event", function () { + stop() + var tooltip = $('<div title="tooltip title"></div>') + .bind("show", function() { + ok(true, "show was called") + start() + }) + .tooltip('show') + }) + + test("should fire shown event", function () { + stop() + var tooltip = $('<div title="tooltip title"></div>') + .bind("shown", function() { + ok(true, "shown was called") + start() + }) + .tooltip('show') + }) + + test("should not fire shown event when default prevented", function () { + stop() + var tooltip = $('<div title="tooltip title"></div>') + .bind("show", function(e) { + e.preventDefault() + ok(true, "show was called") + start() + }) + .bind("shown", function() { + ok(false, "shown was called") + }) + .tooltip('show') + }) + + test("should fire hide event", function () { + stop() + var tooltip = $('<div title="tooltip title"></div>') + .bind("shown", function() { + $(this).tooltip('hide') + }) + .bind("hide", function() { + ok(true, "hide was called") + start() + }) + .tooltip('show') + }) + + test("should fire hidden event", function () { + stop() + var tooltip = $('<div title="tooltip title"></div>') + .bind("shown", function() { + $(this).tooltip('hide') + }) + .bind("hidden", function() { + ok(true, "hidden was called") + start() + }) + .tooltip('show') + }) + + test("should not fire hidden event when default prevented", function () { + stop() + var tooltip = $('<div title="tooltip title"></div>') + .bind("shown", function() { + $(this).tooltip('hide') + }) + .bind("hide", function(e) { + e.preventDefault() + ok(true, "hide was called") + start() + }) + .bind("hidden", function() { + ok(false, "hidden was called") + }) + .tooltip('show') + }) + test("should not show tooltip if leave event occurs before delay expires", function () { var tooltip = $('<a href="#" rel="tooltip" title="Another tooltip"></a>') .appendTo('#qunit-fixture') @@ -156,4 +233,22 @@ $(function () { div.find('a').trigger('click') ok($(".tooltip").is('.fade.in'), 'tooltip is faded in') }) -})
\ No newline at end of file + + test("should show tooltip when toggle is called", function () { + var tooltip = $('<a href="#" rel="tooltip" title="tooltip on toggle"></a>') + .appendTo('#qunit-fixture') + .tooltip({trigger: 'manual'}) + .tooltip('toggle') + ok($(".tooltip").is('.fade.in'), 'tooltip should be toggled in') + }) + + test("should place tooltips inside the body", function () { + var tooltip = $('<a href="#" rel="tooltip" title="Another tooltip"></a>') + .appendTo('#qunit-fixture') + .tooltip({container:'body'}) + .tooltip('show') + ok($("body > .tooltip").length, 'inside the body') + ok(!$("#qunit-fixture > .tooltip").length, 'not found in parent') + tooltip.tooltip('hide') + }) +}) diff --git a/js/tests/unit/bootstrap-typeahead.js b/js/tests/unit/bootstrap-typeahead.js index 4bdbce970..0aa2d61b1 100644 --- a/js/tests/unit/bootstrap-typeahead.js +++ b/js/tests/unit/bootstrap-typeahead.js @@ -192,17 +192,22 @@ $(function () { }).appendTo('body') , typeahead = $input.data('typeahead') , changed = false + , focus = false + , blur = false $input.val('a') typeahead.lookup() $input.change(function() { changed = true }); + $input.focus(function() { focus = true; blur = false }); + $input.blur(function() { blur = true; focus = false }); $(typeahead.$menu.find('li')[2]).mouseover().click() equals($input.val(), 'ac', 'input value was correctly set') ok(!typeahead.$menu.is(':visible'), 'the menu was hidden') ok(changed, 'a change event was fired') + ok(focus && !blur, 'focus is still set') $input.remove() typeahead.$menu.remove() |
