ngx-scroll-lock
Version:
Angular module for Page Scroll locking
146 lines • 12.9 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { Component, Input, ViewEncapsulation, isDevMode, } from '@angular/core';
export class NgxScrollLockComponent {
constructor() {
this.target = '';
this.lock = false;
this.listenerOptions = {
capture: false,
passive: false,
};
}
/**
* @return {?}
*/
ngOnInit() {
this.targetElement = this.target
? document.querySelector(this.target)
: document.body;
// Shows error message only in Development
if (!this.targetElement && isDevMode()) {
console.error(
// tslint:disable-next-line: max-line-length
`\`NgxScrollLockComponent\` need to receive "target" as an element, but it received "${this.target || 'body'}". Please check if the element is unique and it's available in your DOM.`);
}
if (this.lock && this.targetElement) {
this.disableLock(this.targetElement);
}
}
/**
* @return {?}
*/
ngOnDestroy() {
if (this.targetElement) {
this.enableLock(this.targetElement);
}
}
/**
* @param {?} changes
* @return {?}
*/
ngOnChanges(changes) {
if (changes.target &&
!changes.target.firstChange &&
changes.target.previousValue !== changes.target.currentValue) {
this.enableLock(this.targetElement);
this.targetElement = this.target
? document.querySelector(this.target)
: document.body;
if (this.lock && this.targetElement) {
this.disableLock(this.targetElement);
}
}
if (changes.lock &&
!changes.lock.firstChange &&
changes.lock.previousValue !== changes.lock.currentValue &&
this.targetElement) {
changes.lock.currentValue
? this.disableLock(this.targetElement)
: this.enableLock(this.targetElement);
}
}
/**
* @param {?} target
* @return {?}
*/
disableLock(target) {
this.targetElement.classList.add('ngx-scroll-lock');
// Mobile Safari ignores { overflow: hidden } declaration on the body.
if (this.isTouchDevice()) {
this.targetElement.addEventListener('touchmove', this.preventTouchMove, this.listenerOptions);
}
}
/**
* @param {?} target
* @return {?}
*/
enableLock(target) {
this.targetElement.classList.remove('ngx-scroll-lock');
if (this.isTouchDevice()) {
this.targetElement.removeEventListener('touchmove', this.preventTouchMove, this.listenerOptions);
}
}
/**
* @return {?}
*/
isTouchDevice() {
return !!window && ('ontouchstart' in window || navigator.maxTouchPoints);
}
/**
* @param {?} rawEvent
* @return {?}
*/
preventTouchMove(rawEvent) {
/** @type {?} */
const e = rawEvent || Object.assign({}, ((/** @type {?} */ (window))).event, { touches: [] });
// // Do not prevent if the event has more than one touch
// (usually meaning this is a single or multi touch gesture like pinch to zoom)
if (e.touches && e.touches.length >= 1) {
return true;
}
if (e.preventDefault) {
e.preventDefault();
}
return false;
}
}
NgxScrollLockComponent.decorators = [
{ type: Component, args: [{
selector: 'ngx-scroll-lock',
template: `
<style>
.ngx-scroll-lock {
box-sizing: border-box !important;
overflow: hidden !important;
position: inherit !important;
}
</style>
<ng-content></ng-content>
`,
encapsulation: ViewEncapsulation.None
}] }
];
NgxScrollLockComponent.propDecorators = {
target: [{ type: Input }],
lock: [{ type: Input }]
};
if (false) {
/** @type {?} */
NgxScrollLockComponent.prototype.target;
/** @type {?} */
NgxScrollLockComponent.prototype.lock;
/**
* @type {?}
* @private
*/
NgxScrollLockComponent.prototype.targetElement;
/**
* @type {?}
* @private
*/
NgxScrollLockComponent.prototype.listenerOptions;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4LXNjcm9sbC1sb2NrLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL25neC1zY3JvbGwtbG9jay8iLCJzb3VyY2VzIjpbImxpYi9uZ3gtc2Nyb2xsLWxvY2suY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUdULEtBQUssRUFHTCxpQkFBaUIsRUFDakIsU0FBUyxHQUNWLE1BQU0sZUFBZSxDQUFDO0FBZ0J2QixNQUFNLE9BQU8sc0JBQXNCO0lBZG5DO1FBZ0JFLFdBQU0sR0FBRyxFQUFFLENBQUM7UUFHWixTQUFJLEdBQUcsS0FBSyxDQUFDO1FBSUwsb0JBQWUsR0FBRztZQUN4QixPQUFPLEVBQUUsS0FBSztZQUNkLE9BQU8sRUFBRSxLQUFLO1NBQ2YsQ0FBQztJQWlHSixDQUFDOzs7O0lBL0ZDLFFBQVE7UUFDTixJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQyxNQUFNO1lBQzlCLENBQUMsQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUM7WUFDckMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUM7UUFFbEIsMENBQTBDO1FBQzFDLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxJQUFJLFNBQVMsRUFBRSxFQUFFO1lBQ3RDLE9BQU8sQ0FBQyxLQUFLO1lBQ1gsNENBQTRDO1lBQzVDLHVGQUNFLElBQUksQ0FBQyxNQUFNLElBQUksTUFDakIsMEVBQTBFLENBQzNFLENBQUM7U0FDSDtRQUVELElBQUksSUFBSSxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsYUFBYSxFQUFFO1lBQ25DLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1NBQ3RDO0lBQ0gsQ0FBQzs7OztJQUVELFdBQVc7UUFDVCxJQUFJLElBQUksQ0FBQyxhQUFhLEVBQUU7WUFDdEIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsYUFBYSxD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QUFFLGlCQUFpQixDQUFDLElBQUk7YUFDdEM7OztxQkFFRSxLQUFLO21CQUdMLEtBQUs7Ozs7SUFITix3Q0FDWTs7SUFFWixzQ0FDYTs7Ozs7SUFFYiwrQ0FBbUM7Ozs7O0lBRW5DLGlEQUdFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ29tcG9uZW50LFxuICBPbkluaXQsXG4gIE9uRGVzdHJveSxcbiAgSW5wdXQsXG4gIE9uQ2hhbmdlcyxcbiAgU2ltcGxlQ2hhbmdlcyxcbiAgVmlld0VuY2Fwc3VsYXRpb24sXG4gIGlzRGV2TW9kZSxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ25neC1zY3JvbGwtbG9jaycsXG4gIHRlbXBsYXRlOiBgXG4gICAgPHN0eWxlPlxuICAgICAgLm5neC1zY3JvbGwtbG9jayB7XG4gICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3ggIWltcG9ydGFudDtcbiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbiAhaW1wb3J0YW50O1xuICAgICAgICBwb3NpdGlvbjogaW5oZXJpdCAhaW1wb3J0YW50O1xuICAgICAgfVxuICAgIDwvc3R5bGU+XG4gICAgPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PlxuICBgLFxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxufSlcbmV4cG9ydCBjbGFzcyBOZ3hTY3JvbGxMb2NrQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3ksIE9uQ2hhbmdlcyB7XG4gIEBJbnB1dCgpXG4gIHRhcmdldCA9ICcnO1xuXG4gIEBJbnB1dCgpXG4gIGxvY2sgPSBmYWxzZTtcblxuICBwcml2YXRlIHRhcmdldEVsZW1lbnQ6IEhUTUxFbGVtZW50O1xuXG4gIHByaXZhdGUgbGlzdGVuZXJPcHRpb25zID0ge1xuICAgIGNhcHR1cmU6IGZhbHNlLFxuICAgIHBhc3NpdmU6IGZhbHNlLFxuICB9O1xuXG4gIG5nT25Jbml0KCkge1xuICAgIHRoaXMudGFyZ2V0RWxlbWVudCA9IHRoaXMudGFyZ2V0XG4gICAgICA/IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IodGhpcy50YXJnZXQpXG4gICAgICA6IGRvY3VtZW50LmJvZHk7XG5cbiAgICAvLyBTaG93cyBlcnJvciBtZXNzYWdlIG9ubHkgaW4gRGV2ZWxvcG1lbnRcbiAgICBpZiAoIXRoaXMudGFyZ2V0RWxlbWVudCAmJiBpc0Rldk1vZGUoKSkge1xuICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBtYXgtbGluZS1sZW5ndGhcbiAgICAgICAgYFxcYE5neFNjcm9sbExvY2tDb21wb25lbnRcXGAgbmVlZCB0byByZWNlaXZlIFwidGFyZ2V0XCIgYXMgYW4gZWxlbWVudCwgYnV0IGl0IHJlY2VpdmVkIFwiJHtcbiAgICAgICAgICB0aGlzLnRhcmdldCB8fCAnYm9keSdcbiAgICAgICAgfVwiLiBQbGVhc2UgY2hlY2sgaWYgdGhlIGVsZW1lbnQgaXMgdW5pcXVlIGFuZCBpdCdzIGF2YWlsYWJsZSBpbiB5b3VyIERPTS5gXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmxvY2sgJiYgdGhpcy50YXJnZXRFbGVtZW50KSB7XG4gICAgICB0aGlzLmRpc2FibGVMb2NrKHRoaXMudGFyZ2V0RWxlbWVudCk7XG4gICAgfVxuICB9XG5cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgaWYgKHRoaXMudGFyZ2V0RWxlbWVudCkge1xuICAgICAgdGhpcy5lbmFibGVMb2NrKHRoaXMudGFyZ2V0RWxlbWVudCk7XG4gICAgfVxuICB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcykge1xuICAgIGlmIChcbiAgICAgIGNoYW5nZXMudGFyZ2V0ICYmXG4gICAgICAhY2hhbmdlcy50YXJnZXQuZmlyc3RDaGFuZ2UgJiZcbiAgICAgIGNoYW5nZXMudGFyZ2V0LnByZXZpb3VzVmFsdWUgIT09IGNoYW5nZXMudGFyZ2V0LmN1cnJlbnRWYWx1ZVxuICAgICkge1xuICAgICAgdGhpcy5lbmFibGVMb2NrKHRoaXMudGFyZ2V0RWxlbWVudCk7XG4gICAgICB0aGlzLnRhcmdldEVsZW1lbnQgPSB0aGlzLnRhcmdldFxuICAgICAgICA/IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IodGhpcy50YXJnZXQpXG4gICAgICAgIDogZG9jdW1lbnQuYm9keTtcbiAgICAgIGlmICh0aGlzLmxvY2sgJiYgdGhpcy50YXJnZXRFbGVtZW50KSB7XG4gICAgICAgIHRoaXMuZGlzYWJsZUxvY2sodGhpcy50YXJnZXRFbGVtZW50KTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKFxuICAgICAgY2hhbmdlcy5sb2NrICYmXG4gICAgICAhY2hhbmdlcy5sb2NrLmZpcnN0Q2hhbmdlICYmXG4gICAgICBjaGFuZ2VzLmxvY2sucHJldmlvdXNWYWx1ZSAhPT0gY2hhbmdlcy5sb2NrLmN1cnJlbnRWYWx1ZSAmJlxuICAgICAgdGhpcy50YXJnZXRFbGVtZW50XG4gICAgKSB7XG4gICAgICBjaGFuZ2VzLmxvY2suY3VycmVudFZhbHVlXG4gICAgICAgID8gdGhpcy5kaXNhYmxlTG9jayh0aGlzLnRhcmdldEVsZW1lbnQpXG4gICAgICAgIDogdGhpcy5lbmFibGVMb2NrKHRoaXMudGFyZ2V0RWxlbWVudCk7XG4gICAgfVxuICB9XG5cbiAgZGlzYWJsZUxvY2sodGFyZ2V0OiBIVE1MRWxlbWVudCkge1xuICAgIHRoaXMudGFyZ2V0RWxlbWVudC5jbGFzc0xpc3QuYWRkKCduZ3gtc2Nyb2xsLWxvY2snKTtcblxuICAgIC8vIE1vYmlsZSBTYWZhcmkgaWdub3JlcyB7IG92ZXJmbG93OiBoaWRkZW4gfSBkZWNsYXJhdGlvbiBvbiB0aGUgYm9keS5cbiAgICBpZiAodGhpcy5pc1RvdWNoRGV2aWNlKCkpIHtcbiAgICAgIHRoaXMudGFyZ2V0RWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFxuICAgICAgICAndG91Y2htb3ZlJyxcbiAgICAgICAgdGhpcy5wcmV2ZW50VG91Y2hNb3ZlLFxuICAgICAgICB0aGlzLmxpc3RlbmVyT3B0aW9uc1xuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBlbmFibGVMb2NrKHRhcmdldDogSFRNTEVsZW1lbnQpIHtcbiAgICB0aGlzLnRhcmdldEVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZSgnbmd4LXNjcm9sbC1sb2NrJyk7XG5cbiAgICBpZiAodGhpcy5pc1RvdWNoRGV2aWNlKCkpIHtcbiAgICAgIHRoaXMudGFyZ2V0RWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFxuICAgICAgICAndG91Y2htb3ZlJyxcbiAgICAgICAgdGhpcy5wcmV2ZW50VG91Y2hNb3ZlLFxuICAgICAgICB0aGlzLmxpc3RlbmVyT3B0aW9uc1xuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBpc1RvdWNoRGV2aWNlKCkge1xuICAgIHJldHVybiAhIXdpbmRvdyAmJiAoJ29udG91Y2hzdGFydCcgaW4gd2luZG93IHx8IG5hdmlnYXRvci5tYXhUb3VjaFBvaW50cyk7XG4gIH1cblxuICBwcmV2ZW50VG91Y2hNb3ZlKHJhd0V2ZW50OiBUb3VjaEV2ZW50KTogYm9vbGVhbiB7XG4gICAgY29uc3QgZSA9IHJhd0V2ZW50IHx8IHsgLi4uKHdpbmRvdyBhcyBhbnkpLmV2ZW50LCB0b3VjaGVzOiBbXSB9O1xuICAgIC8vIC8vIERvIG5vdCBwcmV2ZW50IGlmIHRoZSBldmVudCBoYXMgbW9yZSB0aGFuIG9uZSB0b3VjaFxuICAgIC8vICh1c3VhbGx5IG1lYW5pbmcgdGhpcyBpcyBhIHNpbmdsZSBvciBtdWx0aSB0b3VjaCBnZXN0dXJlIGxpa2UgcGluY2ggdG8gem9vbSlcbiAgICBpZiAoZS50b3VjaGVzICYmIGUudG91Y2hlcy5sZW5ndGggPj0gMSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgaWYgKGUucHJldmVudERlZmF1bHQpIHtcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cbiJdfQ==