diff options
| author | Jacob <[email protected]> | 2014-10-02 23:11:14 -0700 |
|---|---|---|
| committer | Jacob <[email protected]> | 2014-10-02 23:11:14 -0700 |
| commit | 2c562d2386dc7beb87f9c78e5ae72e66d34258a6 (patch) | |
| tree | 6ef1287ceafd016bfcb38c95404d4719e55af8da | |
| parent | f75fc324622df92ffb0edef30dc87536dfba0b26 (diff) | |
| parent | 038a63b0ebce276186fae93916703dd0e70ac4a1 (diff) | |
| download | bootstrap-2c562d2386dc7beb87f9c78e5ae72e66d34258a6.tar.xz bootstrap-2c562d2386dc7beb87f9c78e5ae72e66d34258a6.zip | |
Merge pull request #14590 from twbs/carousel-keyboard-option
Add `keyboard` option to carousel
| -rw-r--r-- | docs/_includes/js/carousel.html | 6 | ||||
| -rw-r--r-- | js/carousel.js | 7 | ||||
| -rw-r--r-- | js/tests/unit/carousel.js | 79 |
3 files changed, 90 insertions, 2 deletions
diff --git a/docs/_includes/js/carousel.html b/docs/_includes/js/carousel.html index 23f9af97a..62adc09e6 100644 --- a/docs/_includes/js/carousel.html +++ b/docs/_includes/js/carousel.html @@ -178,6 +178,12 @@ $('.carousel').carousel() <td>true</td> <td>Whether the carousel should cycle continuously or have hard stops.</td> </tr> + <tr> + <td>keyboard</td> + <td>boolean</td> + <td>true</td> + <td>Whether the carousel should react to keyboard events.</td> + </tr> </tbody> </table> </div><!-- /.table-responsive --> diff --git a/js/carousel.js b/js/carousel.js index 4c9a1165c..b68899009 100644 --- a/js/carousel.js +++ b/js/carousel.js @@ -14,7 +14,7 @@ // ========================= var Carousel = function (element, options) { - this.$element = $(element).on('keydown.bs.carousel', $.proxy(this.keydown, this)) + this.$element = $(element) this.$indicators = this.$element.find('.carousel-indicators') this.options = options this.paused = @@ -23,6 +23,8 @@ this.$active = this.$items = null + this.options.keyboard && this.$element.on('keydown.bs.carousel', $.proxy(this.keydown, this)) + this.options.pause == 'hover' && !('ontouchstart' in document.documentElement) && this.$element .on('mouseenter.bs.carousel', $.proxy(this.pause, this)) .on('mouseleave.bs.carousel', $.proxy(this.cycle, this)) @@ -35,7 +37,8 @@ Carousel.DEFAULTS = { interval: 5000, pause: 'hover', - wrap: true + wrap: true, + keyboard: true } Carousel.prototype.keydown = function (e) { diff --git a/js/tests/unit/carousel.js b/js/tests/unit/carousel.js index 64d214462..6f0b9642f 100644 --- a/js/tests/unit/carousel.js +++ b/js/tests/unit/carousel.js @@ -399,6 +399,85 @@ $(function () { strictEqual($template.find('.item')[1], $template.find('.active')[0], 'second item active') }) + test('should go to previous item if left arrow key is pressed', function () { + var templateHTML = '<div id="myCarousel" class="carousel" data-interval="false">' + + '<div class="carousel-inner">' + + '<div id="first" class="item">' + + '<img alt="">' + + '</div>' + + '<div id="second" class="item active">' + + '<img alt="">' + + '</div>' + + '<div id="third" class="item">' + + '<img alt="">' + + '</div>' + + '</div>' + + '</div>' + var $template = $(templateHTML) + + $template.bootstrapCarousel() + + strictEqual($template.find('.item')[1], $template.find('.active')[0], 'second item active') + + $template.trigger($.Event('keydown', { which: 37 })) + + strictEqual($template.find('.item')[0], $template.find('.active')[0], 'first item active') + }) + + test('should go to next item if right arrow key is pressed', function () { + var templateHTML = '<div id="myCarousel" class="carousel" data-interval="false">' + + '<div class="carousel-inner">' + + '<div id="first" class="item active">' + + '<img alt="">' + + '</div>' + + '<div id="second" class="item">' + + '<img alt="">' + + '</div>' + + '<div id="third" class="item">' + + '<img alt="">' + + '</div>' + + '</div>' + + '</div>' + var $template = $(templateHTML) + + $template.bootstrapCarousel() + + strictEqual($template.find('.item')[0], $template.find('.active')[0], 'first item active') + + $template.trigger($.Event('keydown', { which: 39 })) + + strictEqual($template.find('.item')[1], $template.find('.active')[0], 'second item active') + }) + + test('should support disabling the keyboard navigation', function () { + var templateHTML = '<div id="myCarousel" class="carousel" data-interval="false" data-keyboard="false">' + + '<div class="carousel-inner">' + + '<div id="first" class="item active">' + + '<img alt="">' + + '</div>' + + '<div id="second" class="item">' + + '<img alt="">' + + '</div>' + + '<div id="third" class="item">' + + '<img alt="">' + + '</div>' + + '</div>' + + '</div>' + var $template = $(templateHTML) + + $template.bootstrapCarousel() + + strictEqual($template.find('.item')[0], $template.find('.active')[0], 'first item active') + + $template.trigger($.Event('keydown', { which: 39 })) + + strictEqual($template.find('.item')[0], $template.find('.active')[0], 'first item still active after right arrow press') + + $template.trigger($.Event('keydown', { which: 37 })) + + strictEqual($template.find('.item')[0], $template.find('.active')[0], 'first item still active after left arrow press') + }) + test('should only add mouseenter and mouseleave listeners when not on mobile', function () { var isMobile = 'ontouchstart' in document.documentElement var templateHTML = '<div id="myCarousel" class="carousel" data-interval="false" data-pause="hover">' |
