|
2 | 2 | * OverlayScrollbars |
3 | 3 | * https://github.com/KingSora/OverlayScrollbars |
4 | 4 | * |
5 | | - * Version: 1.8.0 |
| 5 | + * Version: 1.9.0 |
6 | 6 | * |
7 | 7 | * Copyright KingSora | Rene Haas. |
8 | 8 | * https://github.com/KingSora |
9 | 9 | * |
10 | 10 | * Released under the MIT license. |
11 | | - * Date: 08.07.2019 |
| 11 | + * Date: 27.07.2019 |
12 | 12 | */ |
13 | 13 |
|
14 | 14 | (function (global, factory) { |
|
1440 | 1440 | } |
1441 | 1441 | })(); |
1442 | 1442 | var PLUGIN = (function() { |
| 1443 | + var _plugin; |
1443 | 1444 | var _pluginsGlobals; |
1444 | 1445 | var _pluginsAutoUpdateLoop; |
1445 | 1446 | var _pluginsExtensions = [ ]; |
|
2005 | 2006 | var each = FRAMEWORK.each; |
2006 | 2007 |
|
2007 | 2008 | //make correct instanceof |
2008 | | - var _base = new window[PLUGINNAME](); |
| 2009 | + var _base = new _plugin(); |
2009 | 2010 | var _frameworkProto = FRAMEWORK[LEXICON.p]; |
2010 | 2011 |
|
2011 | 2012 | //if passed element is no HTML element: skip and return |
|
2218 | 2219 | var _ignoreOverlayScrollbarHidingCache; |
2219 | 2220 | var _autoUpdateCache; |
2220 | 2221 | var _sizeAutoCapableCache; |
2221 | | - var _textareaAutoWrappingCache; |
2222 | | - var _textareaInfoCache; |
2223 | 2222 | var _contentElementScrollSizeChangeDetectedCache; |
2224 | 2223 | var _hostElementSizeChangeDetectedCache; |
2225 | 2224 | var _scrollbarsVisibilityCache; |
|
2230 | 2229 | var _normalizeRTLCache; |
2231 | 2230 | var _classNameCache; |
2232 | 2231 | var _oldClassName; |
| 2232 | + var _textareaAutoWrappingCache; |
| 2233 | + var _textareaInfoCache; |
| 2234 | + var _textareaSizeCache; |
2233 | 2235 | var _textareaDynHeightCache; |
2234 | 2236 | var _textareaDynWidthCache; |
2235 | 2237 | var _bodyMinSizeCache; |
|
3519 | 3521 |
|
3520 | 3522 | //update Textarea |
3521 | 3523 | var textareaSize = _isTextarea ? textareaUpdate() : false; |
| 3524 | + var textareaSizeChanged = _isTextarea && checkCacheAutoForce(textareaSize, _textareaSizeCache); |
3522 | 3525 | var textareaDynOrigSize = _isTextarea && textareaSize ? { |
3523 | 3526 | w : textareaDynWidth ? textareaSize._dynamicWidth : textareaSize._originalWidth, |
3524 | 3527 | h : textareaDynHeight ? textareaSize._dynamicHeight : textareaSize._originalHeight |
3525 | 3528 | } : { }; |
3526 | | - |
| 3529 | + _textareaSizeCache = textareaSize; |
| 3530 | + |
3527 | 3531 | //fix height auto / width auto in cooperation with current padding & boxSizing behavior: |
3528 | 3532 | if (heightAuto && (heightAutoChanged || paddingAbsoluteChanged || boxSizingChanged || cssMaxValue.c || padding.c || border.c)) { |
3529 | | - //if (cssMaxValue.ch) |
3530 | | - contentElementCSS[_strMaxMinus + _strHeight] = |
3531 | | - (cssMaxValue.ch ? (cssMaxValue.ih - paddingAbsoluteY + (_isBorderBox ? -_borderY : _paddingY)) |
3532 | | - : _strEmpty); |
| 3533 | + /* |
| 3534 | + if (cssMaxValue.ch) |
| 3535 | + contentElementCSS[_strMaxMinus + _strHeight] = |
| 3536 | + (cssMaxValue.ch ? (cssMaxValue.ih - paddingAbsoluteY + (_isBorderBox ? -_borderY : _paddingY)) |
| 3537 | + : _strEmpty); |
| 3538 | + */ |
3533 | 3539 | contentElementCSS[_strHeight] = _strAuto; |
3534 | 3540 | } |
3535 | 3541 | else if (heightAutoChanged || paddingAbsoluteChanged) { |
3536 | 3542 | contentElementCSS[_strMaxMinus + _strHeight] = _strEmpty; |
3537 | 3543 | contentElementCSS[_strHeight] = _strHundredPercent; |
3538 | 3544 | } |
3539 | 3545 | if (widthAuto && (widthAutoChanged || paddingAbsoluteChanged || boxSizingChanged || cssMaxValue.c || padding.c || border.c || cssDirectionChanged)) { |
3540 | | - //if (cssMaxValue.cw) |
3541 | | - contentElementCSS[_strMaxMinus + _strWidth] = |
3542 | | - (cssMaxValue.cw ? (cssMaxValue.iw - paddingAbsoluteX + (_isBorderBox ? -_borderX : _paddingX)) + |
3543 | | - (_nativeScrollbarIsOverlaid.y /*&& _hasOverflowCache.y && widthAuto */ ? _overlayScrollbarDummySize.y : 0) |
3544 | | - : _strEmpty); |
| 3546 | + /* |
| 3547 | + if (cssMaxValue.cw) |
| 3548 | + contentElementCSS[_strMaxMinus + _strWidth] = |
| 3549 | + (cssMaxValue.cw ? (cssMaxValue.iw - paddingAbsoluteX + (_isBorderBox ? -_borderX : _paddingX)) + |
| 3550 | + (_nativeScrollbarIsOverlaid.y ? _overlayScrollbarDummySize.y : 0) |
| 3551 | + : _strEmpty); |
| 3552 | + */ |
3545 | 3553 | contentElementCSS[_strWidth] = _strAuto; |
3546 | 3554 | contentGlueElementCSS[_strMaxMinus + _strWidth] = _strHundredPercent; //IE Fix |
3547 | 3555 | } |
|
3581 | 3589 | contentGlueElementCSS = {}; |
3582 | 3590 |
|
3583 | 3591 | //if [content(host) client / scroll size, or target element direction, or content(host) max-sizes] changed, or force is true |
3584 | | - if (hostSizeChanged || contentSizeChanged || cssDirectionChanged || boxSizingChanged || paddingAbsoluteChanged || widthAutoChanged || widthAuto || heightAutoChanged || heightAuto || cssMaxValue.c || ignoreOverlayScrollbarHidingChanged || overflowBehaviorChanged || clipAlwaysChanged || resizeChanged || scrollbarsVisibilityChanged || scrollbarsAutoHideChanged || scrollbarsDragScrollingChanged || scrollbarsClickScrollingChanged || textareaDynWidthChanged || textareaDynHeightChanged || textareaAutoWrappingChanged) { |
| 3592 | + if (hostSizeChanged || contentSizeChanged || textareaSizeChanged || cssDirectionChanged || boxSizingChanged || paddingAbsoluteChanged || widthAutoChanged || widthAuto || heightAutoChanged || heightAuto || cssMaxValue.c || ignoreOverlayScrollbarHidingChanged || overflowBehaviorChanged || clipAlwaysChanged || resizeChanged || scrollbarsVisibilityChanged || scrollbarsAutoHideChanged || scrollbarsDragScrollingChanged || scrollbarsClickScrollingChanged || textareaDynWidthChanged || textareaDynHeightChanged || textareaAutoWrappingChanged) { |
3585 | 3593 | var strOverflow = 'overflow'; |
3586 | 3594 | var strOverflowX = strOverflow + '-x'; |
3587 | 3595 | var strOverflowY = strOverflow + '-y'; |
|
3597 | 3605 | //Reset the viewport (very important for natively overlaid scrollbars and zoom change |
3598 | 3606 | //don't change the overflow prop as it is very expensive and affects performance !A LOT! |
3599 | 3607 | var viewportElementResetCSS = { }; |
3600 | | - var resetXTmp = _hasOverflowCache.y && _hideOverflowCache.ys && !ignoreOverlayScrollbarHiding ? (_nativeScrollbarIsOverlaid.y ? _viewportElement.css(isRTLLeft) : -_nativeScrollbarSize.y) : 0; |
3601 | | - var resetBottomTmp = _hasOverflowCache.x && _hideOverflowCache.xs && !ignoreOverlayScrollbarHiding ? (_nativeScrollbarIsOverlaid.x ? _viewportElement.css(_strBottom) : -_nativeScrollbarSize.x) : 0; |
| 3608 | + var resetXTmp = _hasOverflowCache.y && _hideOverflowCache.ys && !ignoreOverlayScrollbarHiding && !_nativeScrollbarStyling ? (_nativeScrollbarIsOverlaid.y ? _viewportElement.css(isRTLLeft) : -_nativeScrollbarSize.y) : 0; |
| 3609 | + var resetBottomTmp = _hasOverflowCache.x && _hideOverflowCache.xs && !ignoreOverlayScrollbarHiding && !_nativeScrollbarStyling ? (_nativeScrollbarIsOverlaid.x ? _viewportElement.css(_strBottom) : -_nativeScrollbarSize.x) : 0; |
3602 | 3610 | setTopRightBottomLeft(viewportElementResetCSS, _strEmpty); |
3603 | 3611 | _viewportElement.css(viewportElementResetCSS); |
3604 | 3612 | if(hideOverflow4CorrectMeasuring) |
|
3671 | 3679 | contentGlueElementCSS[strWH] = maxSize + (_isBorderBox ? 0 : paddingSize) + 1; |
3672 | 3680 |
|
3673 | 3681 | //if size is auto and host is smaller than size as min size, make content glue size -1 to make sure size changes will be detected (this is only needed if padding is 0) |
3674 | | - if (autoSize && (contentSize[wh] < _viewportSize[wh]) && (horizontal ? (_isTextarea ? !textareaAutoWrapping : false) : true)) { |
| 3682 | + if (autoSize && (contentSize[wh] < _viewportSize[wh]) && (horizontal && _isTextarea ? !textareaAutoWrapping : true)) { |
3675 | 3683 | if (_isTextarea) |
3676 | 3684 | textareaCoverCSS[strWH] = parseToZeroOrNumber(_textareaCoverElement.css(strWH)) - 1; |
3677 | 3685 | contentGlueElementCSS[strWH] -= 1; |
|
4015 | 4023 | else |
4016 | 4024 | _scrollbarCornerElement[remove ? 'off' : 'on'](_strMouseTouchDownEvent, _resizeOnMouseTouchDown); |
4017 | 4025 | }; |
4018 | | - removeClass(_scrollbarCornerElement, [ |
4019 | | - _classNameHostResizeDisabled, |
| 4026 | + removeClass(_scrollbarCornerElement, [ |
4020 | 4027 | _classNameScrollbarCornerResize, |
4021 | 4028 | _classNameScrollbarCornerResizeB, |
4022 | 4029 | _classNameScrollbarCornerResizeH, |
|
4026 | 4033 | setupCornerEvents(true); |
4027 | 4034 | } |
4028 | 4035 | else { |
| 4036 | + removeClass(_hostElement, _classNameHostResizeDisabled); |
4029 | 4037 | addClass(_scrollbarCornerElement, _classNameScrollbarCornerResize); |
4030 | 4038 | if (_resizeBoth) |
4031 | 4039 | addClass(_scrollbarCornerElement, _classNameScrollbarCornerResizeB); |
|
6130 | 6138 | * @returns {{}} The instance of the added extension or undefined if the extension couldn't be added properly. |
6131 | 6139 | */ |
6132 | 6140 | _base.addExt = function(extName, extensionOptions) { |
6133 | | - var registeredExtensionObj = window[PLUGINNAME].extension(extName); |
| 6141 | + var registeredExtensionObj = _plugin.extension(extName); |
6134 | 6142 | var instance; |
6135 | 6143 | var instanceAdded; |
6136 | 6144 | var instanceContract; |
|
6318 | 6326 | * @param extensions The extension(s) which shall be added right after initialization. |
6319 | 6327 | * @returns {*} |
6320 | 6328 | */ |
6321 | | - window[PLUGINNAME] = function(pluginTargetElements, options, extensions) { |
| 6329 | + _plugin = window[PLUGINNAME] = function(pluginTargetElements, options, extensions) { |
6322 | 6330 | if(arguments[LEXICON.l] === 0) |
6323 | 6331 | return this; |
6324 | 6332 |
|
|
6352 | 6360 | else { |
6353 | 6361 | FRAMEWORK.each(pluginTargetElements, function(i, v) { |
6354 | 6362 | inst = INSTANCES(v); |
6355 | | - if((options === '!' && inst instanceof window[PLUGINNAME]) || (COMPATIBILITY.type(options) == TYPES.f && options(v, inst))) |
| 6363 | + if((options === '!' && _plugin.valid(inst)) || (COMPATIBILITY.type(options) == TYPES.f && options(v, inst))) |
6356 | 6364 | arr.push(inst); |
6357 | 6365 | else if(options === undefined) |
6358 | 6366 | arr.push(inst); |
|
6367 | 6375 | * Returns a object which contains global information about the plugin and each instance of it. |
6368 | 6376 | * The returned object is just a copy, that means that changes to the returned object won't have any effect to the original object. |
6369 | 6377 | */ |
6370 | | - window[PLUGINNAME].globals = function () { |
| 6378 | + _plugin.globals = function () { |
6371 | 6379 | initOverlayScrollbarsStatics(); |
6372 | 6380 | var globals = FRAMEWORK.extend(true, { }, _pluginsGlobals); |
6373 | 6381 | delete globals['msie']; |
|
6378 | 6386 | * Gets or Sets the default options for each new plugin initialization. |
6379 | 6387 | * @param newDefaultOptions The object with which the default options shall be extended. |
6380 | 6388 | */ |
6381 | | - window[PLUGINNAME].defaultOptions = function(newDefaultOptions) { |
| 6389 | + _plugin.defaultOptions = function(newDefaultOptions) { |
6382 | 6390 | initOverlayScrollbarsStatics(); |
6383 | 6391 | var currDefaultOptions = _pluginsGlobals.defaultOptions; |
6384 | 6392 | if(newDefaultOptions === undefined) |
|
6388 | 6396 | _pluginsGlobals.defaultOptions = FRAMEWORK.extend(true, { }, currDefaultOptions , _pluginsOptions._validate(newDefaultOptions, _pluginsOptions._template, true, currDefaultOptions)._default); |
6389 | 6397 | }; |
6390 | 6398 |
|
| 6399 | + /** |
| 6400 | + * Checks whether the passed instance is a non-destroyed OverlayScrollbars instance. |
| 6401 | + * @param osInstance The potential OverlayScrollbars instance which shall be checked. |
| 6402 | + * @returns {boolean} True if the passed value is a non-destroyed OverlayScrollbars instance, false otherwise. |
| 6403 | + */ |
| 6404 | + _plugin.valid = function (osInstance) { |
| 6405 | + return osInstance instanceof _plugin && !osInstance.getState().destroyed; |
| 6406 | + }; |
| 6407 | + |
6391 | 6408 | /** |
6392 | 6409 | * Registers, Unregisters or returns a extension. |
6393 | 6410 | * Register: Pass the name and the extension. (defaultOptions is optional) |
|
6398 | 6415 | * @param extension A function which generates the instance of the extension or anything other to remove a already registered extension. |
6399 | 6416 | * @param defaultOptions The default options which shall be used for the registered extension. |
6400 | 6417 | */ |
6401 | | - window[PLUGINNAME].extension = function(extensionName, extension, defaultOptions) { |
| 6418 | + _plugin.extension = function(extensionName, extension, defaultOptions) { |
6402 | 6419 | var extNameTypeString = COMPATIBILITY.type(extensionName) == TYPES.s; |
6403 | 6420 | var argLen = arguments[LEXICON.l]; |
6404 | 6421 | var i = 0; |
|
6428 | 6445 | } |
6429 | 6446 | }; |
6430 | 6447 |
|
6431 | | - return window[PLUGINNAME]; |
| 6448 | + return _plugin; |
6432 | 6449 | })(); |
6433 | 6450 |
|
6434 | 6451 | if(JQUERY && JQUERY.fn) { |
|
0 commit comments