From 8ecd8c3898bb5593a693561965b49d6a455759ca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Go=C5=82e=CC=A8biowski-Owczarek?= Date: Wed, 17 Jun 2020 22:15:22 +0200 Subject: [PATCH] Menu: Account for scrollbars in jQuery 3.2 jQuery >=3.2 doesn't include scrollbars in `.height()`, this commit switches it to `.innerHeight()` which does so in jQuery >=3.3. In jQuery 3.2 it doesn't either so include scrollbars in innerHeight, add it back. Using `.innerHeight()` instead of `.height()` should be fine as menu doesn't define padding styles. --- ui/widgets/menu.js | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/ui/widgets/menu.js b/ui/widgets/menu.js index 7706ee578e6..3b17112f8b1 100644 --- a/ui/widgets/menu.js +++ b/ui/widgets/menu.js @@ -626,7 +626,13 @@ return $.widget( "ui.menu", { } if ( this._hasScroll() ) { base = this.active.offset().top; - height = this.element.height(); + height = this.element.innerHeight(); + + // jQuery 3.2 doesn't include scrollbars in innerHeight, add it back. + if ( $.fn.jquery.indexOf( "3.2." ) === 0 ) { + height += this.element[ 0 ].offsetHeight - this.element.outerHeight(); + } + this.active.nextAll( ".ui-menu-item" ).each( function() { item = $( this ); return item.offset().top - base - height < 0; @@ -650,7 +656,13 @@ return $.widget( "ui.menu", { } if ( this._hasScroll() ) { base = this.active.offset().top; - height = this.element.height(); + height = this.element.innerHeight(); + + // jQuery 3.2 doesn't include scrollbars in innerHeight, add it back. + if ( $.fn.jquery.indexOf( "3.2." ) === 0 ) { + height += this.element[ 0 ].offsetHeight - this.element.outerHeight(); + } + this.active.prevAll( ".ui-menu-item" ).each( function() { item = $( this ); return item.offset().top - base + height > 0;