From da495ee24c239ef9c9c154670b1a641745ac147f Mon Sep 17 00:00:00 2001 From: fat Date: Wed, 13 May 2015 12:55:11 -0700 Subject: [PATCH] address https://github.com/twbs/bootstrap/pull/16135 --- js/dist/scrollspy.js | 18 +++++--- js/dist/scrollspy.js.map | Bin 14460 -> 14883 bytes js/src/scrollspy.js | 21 ++++++--- js/tests/unit/scrollspy.js | 86 +++++++++++++++++++++++++++++++++++++ 4 files changed, 111 insertions(+), 14 deletions(-) diff --git a/js/dist/scrollspy.js b/js/dist/scrollspy.js index a748f7782..69fc579ed 100644 --- a/js/dist/scrollspy.js +++ b/js/dist/scrollspy.js @@ -27,7 +27,8 @@ var ScrollSpy = (function ($) { var JQUERY_NO_CONFLICT = $.fn[NAME]; var Default = { - offset: 10 + offset: 10, + method: 'auto' }; var Event = { @@ -48,6 +49,11 @@ var ScrollSpy = (function ($) { LI: 'li' }; + var OffsetMethod = { + OFFSET: 'offset', + POSITION: 'position' + }; + /** * ------------------------------------------------------------------------ * Class Definition @@ -81,13 +87,11 @@ var ScrollSpy = (function ($) { value: function refresh() { var _this = this; - var offsetMethod = 'offset'; - var offsetBase = 0; + var autoMethod = this._scrollElement !== this._scrollElement.window ? OffsetMethod.POSITION : OffsetMethod.OFFSET; - if (this._scrollElement !== this._scrollElement.window) { - offsetMethod = 'position'; - offsetBase = this._getScrollTop(); - } + var offsetMethod = this._config.method === 'auto' ? autoMethod : this._config.method; + + var offsetBase = offsetMethod === OffsetMethod.POSITION ? this._getScrollTop() : 0; this._offsets = []; this._targets = []; diff --git a/js/dist/scrollspy.js.map b/js/dist/scrollspy.js.map index 9a134b521f1847d87736c0a4d652d68dd1206553..98292c7fd831522ea315f1384977aa1804862b49 100644 GIT binary patch delta 737 zcmZvYy-UMT6vavX0P$;Sl@8Je6}mj@2ZCUUauZ`IwboJ#3ZevUZL}t#c}{|^4sKc8 z{Rf2LEDHV=F3zs5BHs628l#vgx%ZskIX9o~9lO6)(g6AnZ2(lL0Z^nBd@B?|Z)?Gg z0*VG;tcfAr1=yuU)D+NSYmui+YXG%yh@zSVA+o_iEO<%0CWiQ@aQjcgDgR?2y@IEfkP%Ea`kz5_|uBB$F%ylw~=D&FZ{T0~gc#T-^!PQL^L;kGLhC zs(06DiL=Gf1Tgs(hU_C|QHyykFbBuRl_lRz)s)5HIrXe0yOkoX1Jnz>2fzw$CuasH z=$=jRIcu`Eb3~R&&OB#ME_j)GP&NoTbZn22YOCcnSw%`zav?3%_4T^3jb1c4LXit$ zTh)4LyHwre8`tqHW;u4?W*+-SIXvR{Zg$~{tV$X$5zooTAiw4^cF*qFI!#7od<14~ z%gY~N_m*{>4=+#x!uSwKDp@{!gGphe{pZ}Ik_2WO83%;_K F$!|(_+baM7 delta 383 zcmZ2n@~2=!2P2ESqjS{eg^Z4jn{}8kGucHtI!5ZaJ36}S1Ufnf>Nq<(I$AqAIvYFb z0A)ONLLD7LLDJqJ8E1$zP~NowB0rgfP0zp;$Oq{uanUJuf*S|c2{W$BNhcpD1u<&! ze>PD8uuQO{bAhup$UK+HzU=awJ=ov#F`0TzP7qU>94n^7XtcRY>=2_!fv>wxu%lzJ zH4Hd9rf*J=&}G}aSZ*uh { const JQUERY_NO_CONFLICT = $.fn[NAME] const Default = { - offset : 10 + offset : 10, + method : 'auto' } const Event = { @@ -46,6 +47,11 @@ const ScrollSpy = (($) => { LI : 'li' } + const OffsetMethod = { + OFFSET : 'offset', + POSITION : 'position' + } + /** * ------------------------------------------------------------------------ @@ -86,13 +92,14 @@ const ScrollSpy = (($) => { // public refresh() { - let offsetMethod = 'offset' - let offsetBase = 0 + let autoMethod = this._scrollElement !== this._scrollElement.window ? + OffsetMethod.POSITION : OffsetMethod.OFFSET - if (this._scrollElement !== this._scrollElement.window) { - offsetMethod = 'position' - offsetBase = this._getScrollTop() - } + let offsetMethod = this._config.method === 'auto' ? + autoMethod : this._config.method + + let offsetBase = offsetMethod === OffsetMethod.POSITION ? + this._getScrollTop() : 0 this._offsets = [] this._targets = [] diff --git a/js/tests/unit/scrollspy.js b/js/tests/unit/scrollspy.js index bf5fa0bff..bf963b3ab 100644 --- a/js/tests/unit/scrollspy.js +++ b/js/tests/unit/scrollspy.js @@ -275,4 +275,90 @@ $(function () { .then(function () { return testElementIsActiveAfterScroll('#li-100-1', '#div-100-1') }) }) + QUnit.test('should allow passed in option offset method: offset', function (assert) { + assert.expect(4) + + var testOffsetMethod = function (type) { + var deferred = $.Deferred() + var navbarHtml = + '' + var contentHtml = + '
' + + '
div 1
' + + '
div 2
' + + '
div 3
' + + '
' + + + $(navbarHtml).appendTo('#qunit-fixture') + var $content = $(contentHtml) + .appendTo('#qunit-fixture') + + if (type === 'js') $content.bootstrapScrollspy({ target: '.navbar', offset: 0, method: 'offset' }) + else if (type === 'data') $(window).trigger('load.bs.scrollspy.data-api') + + var $target = $('#div-' + type + 'm-2') + var scrollspy = $content.data('bs.scrollspy') + + assert.ok(scrollspy._offsets[1] === $target.offset().top, 'offsed method with ' + type + ' option') + assert.ok(scrollspy._offsets[1] !== $target.position().top, 'position method with ' + type + ' option') + + deferred.resolve() + + return deferred.promise() + } + + $.when(testOffsetMethod('js')) + .then(function () { testOffsetMethod('data') }) + }) + + QUnit.test('should allow passed in option offset method: position', function (assert) { + assert.expect(4) + + var testOffsetMethod = function (type) { + var deferred = $.Deferred() + var navbarHtml = + '' + var contentHtml = + '
' + + '
div 1
' + + '
div 2
' + + '
div 3
' + + '
' + + + $(navbarHtml).appendTo('#qunit-fixture') + var $content = $(contentHtml) + .appendTo('#qunit-fixture') + + if (type === 'js') $content.bootstrapScrollspy({ target: '.navbar', offset: 0, method: 'position' }) + else if (type === 'data') $(window).trigger('load.bs.scrollspy.data-api') + + var $target = $('#div-' + type + 'm-2') + var scrollspy = $content.data('bs.scrollspy') + + assert.ok(scrollspy._offsets[1] !== $target.offset().top, 'offsed method with ' + type + ' option') + assert.ok(scrollspy._offsets[1] === $target.position().top, 'position method with ' + type + ' option') + + deferred.resolve() + + return deferred.promise() + } + + $.when(testOffsetMethod('js')) + .then(function () { testOffsetMethod('data') }) + }) + })