From b0d142334f0d15e63577b28e2d7045c2199dcd6a Mon Sep 17 00:00:00 2001 From: fat Date: Wed, 13 May 2015 13:43:56 -0700 Subject: [PATCH] fix #15301 --- js/dist/modal.js | 5 +++-- js/dist/modal.js.map | Bin 26483 -> 26637 bytes js/dist/scrollspy.js | 28 ++++++++++++++++++----- js/dist/scrollspy.js.map | Bin 14883 -> 15763 bytes js/src/modal.js | 2 +- js/src/scrollspy.js | 25 +++++++++++++++++---- js/tests/unit/scrollspy.js | 45 +++++++++++++++++++++++++++++++++++++ 7 files changed, 93 insertions(+), 12 deletions(-) diff --git a/js/dist/modal.js b/js/dist/modal.js index 25292b275..80a493777 100644 --- a/js/dist/modal.js +++ b/js/dist/modal.js @@ -31,6 +31,7 @@ var Modal = (function ($) { var Default = { backdrop: true, keyboard: true, + focus: true, show: true }; @@ -206,14 +207,14 @@ var Modal = (function ($) { $(this._element).addClass(ClassName.IN); - this._enforceFocus(); + if (this._config.focus) this._enforceFocus(); var shownEvent = $.Event(Event.SHOWN, { relatedTarget: relatedTarget }); var transitionComplete = function transitionComplete() { - _this2._element.focus(); + if (_this2._config.focus) _this2._element.focus(); $(_this2._element).trigger(shownEvent); }; diff --git a/js/dist/modal.js.map b/js/dist/modal.js.map index bbdbb1d45d0577014e57efd24e46c3a7d1bc034b..247fbab7de2b193a0a49c3bd6f2d85a2fea0c943 100644 GIT binary patch delta 171 zcmex-jZVd{A11+Z!t6s^dBN54#MLsq^Hk!oBjz zj*gx>{vbIZ;jiQD=;*A2Q0hOqQ%sf>C}!@wxlJTafg>$HxwKe8L1FVX6D{G%QjuJ| s$@zI{ndy393C+p>-B*ccrYUHYWMmfW#iPo-^ir5C?I*eUp~oaS0NZvsga7~l delta 65 zcmV-H0KWf?&;j$#0kGl$v-Sbm5t9@M88*;o#f%Tf`OwN4qcdr6WWWS<$( diff --git a/js/dist/scrollspy.js b/js/dist/scrollspy.js index 69fc579ed..47774a95b 100644 --- a/js/dist/scrollspy.js +++ b/js/dist/scrollspy.js @@ -28,7 +28,8 @@ var ScrollSpy = (function ($) { var Default = { offset: 10, - method: 'auto' + method: 'auto', + target: '' }; var Event = { @@ -45,8 +46,9 @@ var ScrollSpy = (function ($) { var Selector = { DATA_SPY: '[data-spy="scroll"]', ACTIVE: '.active', + LI: 'li', LI_DROPDOWN: 'li.dropdown', - LI: 'li' + NAV_ANCHORS: '.nav li > a' }; var OffsetMethod = { @@ -66,8 +68,8 @@ var ScrollSpy = (function ($) { this._element = element; this._scrollElement = element.tagName === 'BODY' ? window : element; - this._config = $.extend({}, Default, config); - this._selector = '' + (this._config.target || '') + ' .nav li > a'; + this._config = this._getConfig(config); + this._selector = '' + this._config.target + ' ' + Selector.NAV_ANCHORS; this._offsets = []; this._targets = []; this._activeTarget = null; @@ -137,10 +139,26 @@ var ScrollSpy = (function ($) { this._scrollHeight = null; } }, { - key: '_getScrollTop', + key: '_getConfig', // private + value: function _getConfig(config) { + config = $.extend({}, Default, config); + + if (typeof config.target !== 'string') { + var id = $(config.target).attr('id'); + if (!id) { + id = Util.getUID(NAME); + $(config.target).attr('id', id); + } + config.target = '#' + id; + } + + return config; + } + }, { + key: '_getScrollTop', value: function _getScrollTop() { return this._scrollElement === window ? this._scrollElement.scrollY : this._scrollElement.scrollTop; } diff --git a/js/dist/scrollspy.js.map b/js/dist/scrollspy.js.map index 98292c7fd831522ea315f1384977aa1804862b49..3f2a3c41fefca9463fe8ccb416020be6eeb2c417 100644 GIT binary patch delta 1016 zcmZ`$&uhIs2yHnuQ$&F}L1R*Xbc4xbxWq7AmfGVvZnIDFuH?hi#s-k|@g(!%Lhy^jsHE4}j7DIeI6Xges3*LBUJhxe; zCs`qe=A>&wKwo5ON7Omog8#nqu!&8>Wwaq?lmW^LE?r1s0id9U%biieVL~D=GmtvU z)|7H_<9EVgUR((Bxz%7xc7=ut4~6!Gj-ez(Zc0Z^mEdU)OSNd0Vvy`#prD9ZXOeL- z1aACdU5+8gvb?unDWq%iV6#!~Ye6KF>=Qe>#y5TY9VQ7jf{+B|rF^(;NHxS7e2 z#Hs68c0X~6K*#|7TV0YN@uXr;7^$@Bx=u1-brUIHo)GJZBsZ<@Ukcb2{F-YG(zr$~ zznd&U(U7cLejfi-zeDXv#DS40vkXBcaq@zxz zlcQrYmPhTE7a5|sH@j1 a=;bArDdc1-*eN7#-l(F { $(this._element).addClass(ClassName.IN) - this._enforceFocus() + if (this._config.focus) this._enforceFocus() let shownEvent = $.Event(Event.SHOWN, { relatedTarget: relatedTarget diff --git a/js/src/scrollspy.js b/js/src/scrollspy.js index 3f4a145a1..bb639f91b 100644 --- a/js/src/scrollspy.js +++ b/js/src/scrollspy.js @@ -26,7 +26,8 @@ const ScrollSpy = (($) => { const Default = { offset : 10, - method : 'auto' + method : 'auto', + target : '' } const Event = { @@ -43,8 +44,9 @@ const ScrollSpy = (($) => { const Selector = { DATA_SPY : '[data-spy="scroll"]', ACTIVE : '.active', + LI : 'li', LI_DROPDOWN : 'li.dropdown', - LI : 'li' + NAV_ANCHORS : '.nav li > a' } const OffsetMethod = { @@ -64,8 +66,8 @@ const ScrollSpy = (($) => { constructor(element, config) { this._element = element this._scrollElement = element.tagName === 'BODY' ? window : element - this._config = $.extend({}, Default, config) - this._selector = `${this._config.target || ''} .nav li > a` + this._config = this._getConfig(config) + this._selector = `${this._config.target} ${Selector.NAV_ANCHORS}` this._offsets = [] this._targets = [] this._activeTarget = null @@ -150,6 +152,21 @@ const ScrollSpy = (($) => { // private + _getConfig(config) { + config = $.extend({}, Default, config) + + if (typeof config.target !== 'string') { + let id = $(config.target).attr('id') + if (!id) { + id = Util.getUID(NAME) + $(config.target).attr('id', id) + } + config.target = `#${id}` + } + + return config + } + _getScrollTop() { return this._scrollElement === window ? this._scrollElement.scrollY : this._scrollElement.scrollTop diff --git a/js/tests/unit/scrollspy.js b/js/tests/unit/scrollspy.js index bf963b3ab..a4407ece9 100644 --- a/js/tests/unit/scrollspy.js +++ b/js/tests/unit/scrollspy.js @@ -77,6 +77,51 @@ $(function () { $scrollspy.scrollTop(350) }) + QUnit.test('should only switch "active" class on current target specified w element', function (assert) { + assert.expect(1) + var done = assert.async() + + var sectionHTML = '
' + + '
' + + '
' + + '
' + + '' + + '
' + + '
' + + '
' + + '
' + + '
' + + '

Overview

' + + '

' + + 'Ad leggings keytar, brunch id art party dolor labore.' + + '

' + + '
' + + '
' + + '

Detail

' + + '

' + + 'Veniam marfa mustache skateboard, adipisicing fugiat velit pitchfork beard.' + + '

' + + '
' + + '
' + + '
' + var $section = $(sectionHTML).appendTo('#qunit-fixture') + + var $scrollspy = $section + .show() + .find('#scrollspy-example') + .bootstrapScrollspy({ target: $('#ss-target') }) + + $scrollspy.on('scroll.bs.scrollspy', function () { + assert.ok($section.hasClass('active'), '"active" class still on root node') + done() + }) + + $scrollspy.scrollTop(350) + }) + QUnit.test('should correctly select middle navigation option when large offset is used', function (assert) { assert.expect(3) var done = assert.async()