mirror of
https://github.com/tenrok/OverlayScrollbars.git
synced 2026-06-25 01:30:36 +03:00
add debounce fn and improve code
This commit is contained in:
@@ -1,4 +1,4 @@
|
|||||||
import { each, indexOf, isString, MutationObserverConstructor, isEmptyArray, on, off, attr, is, find, push } from 'support';
|
import { each, debounce, indexOf, isString, MutationObserverConstructor, isEmptyArray, on, off, attr, is, find, push } from 'support';
|
||||||
|
|
||||||
type StringNullUndefined = string | null | undefined;
|
type StringNullUndefined = string | null | undefined;
|
||||||
|
|
||||||
@@ -32,11 +32,11 @@ export const createDOMObserver = (
|
|||||||
): DOMObserver => {
|
): DOMObserver => {
|
||||||
let isConnected = false;
|
let isConnected = false;
|
||||||
const { _observeContent, _attributes, _ignoreContentChange, _eventContentChange } = options || {};
|
const { _observeContent, _attributes, _ignoreContentChange, _eventContentChange } = options || {};
|
||||||
const eventContentChangeCallback = () => {
|
const eventContentChangeCallback = debounce(() => {
|
||||||
if (isConnected) {
|
if (isConnected) {
|
||||||
callback([], false, true);
|
callback([], false, true);
|
||||||
}
|
}
|
||||||
};
|
});
|
||||||
const refreshEventContentChange = (getElements: (selector: string) => Node[]) => {
|
const refreshEventContentChange = (getElements: (selector: string) => Node[]) => {
|
||||||
if (_eventContentChange) {
|
if (_eventContentChange) {
|
||||||
const eventContentChanges = _eventContentChange();
|
const eventContentChanges = _eventContentChange();
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
import { each, hasOwnProperty } from 'support/utils';
|
import { each } from 'support/utils/array';
|
||||||
import { createDiv } from 'support/dom';
|
import { hasOwnProperty } from 'support/utils/object';
|
||||||
|
import { createDiv } from 'support/dom/create';
|
||||||
|
|
||||||
const firstLetterToUpper = (str: string): string => str.charAt(0).toUpperCase() + str.slice(1);
|
const firstLetterToUpper = (str: string): string => str.charAt(0).toUpperCase() + str.slice(1);
|
||||||
const getDummyStyle = (): CSSStyleDeclaration => createDiv().style;
|
const getDummyStyle = (): CSSStyleDeclaration => createDiv().style;
|
||||||
|
|||||||
@@ -0,0 +1,34 @@
|
|||||||
|
import { isNumber } from 'support/utils/types';
|
||||||
|
import { cAF, rAF } from 'support/compatibility/apis';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Debounces the given function either with a timeout or a animation frame.
|
||||||
|
* @param functionToDebounce The function which shall be debounced.
|
||||||
|
* @param timeout The timeout for debouncing. If 0 or lower animation frame is used for debouncing, a timeout otherwise.
|
||||||
|
* @param maxWait A maximum amount of ms. before the function will be called even with debounce.
|
||||||
|
*/
|
||||||
|
export const debounce = (functionToDebounce: (...args: any) => any, timeout?: number, maxWait?: number) => {
|
||||||
|
let timeoutId: number | void;
|
||||||
|
let lastCallTime: number;
|
||||||
|
const hasTimeout = isNumber(timeout) && timeout > 0;
|
||||||
|
const hasMaxWait = isNumber(maxWait) && maxWait > 0;
|
||||||
|
const cancel = hasTimeout ? window.clearTimeout : cAF!;
|
||||||
|
const set = hasTimeout ? window.setTimeout : rAF!;
|
||||||
|
const setFn = function (args: IArguments) {
|
||||||
|
lastCallTime = hasMaxWait ? performance.now() : 0;
|
||||||
|
timeoutId && cancel(timeoutId);
|
||||||
|
// eslint-disable-next-line
|
||||||
|
// @ts-ignore
|
||||||
|
functionToDebounce.apply(this, args);
|
||||||
|
};
|
||||||
|
|
||||||
|
return function () {
|
||||||
|
// eslint-disable-next-line
|
||||||
|
// @ts-ignore
|
||||||
|
const boundSetFn = setFn.bind(this, arguments); // eslint-disable-line
|
||||||
|
const forceCall = hasMaxWait ? performance.now() - lastCallTime >= maxWait! : false;
|
||||||
|
|
||||||
|
timeoutId && cancel(timeoutId);
|
||||||
|
timeoutId = forceCall ? boundSetFn() : (set(boundSetFn, timeout!) as number);
|
||||||
|
};
|
||||||
|
};
|
||||||
@@ -1,5 +1,6 @@
|
|||||||
export * from 'support/utils/array';
|
export * from 'support/utils/array';
|
||||||
export * from 'support/utils/equal';
|
export * from 'support/utils/equal';
|
||||||
|
export * from 'support/utils/function';
|
||||||
export * from 'support/utils/lexicon';
|
export * from 'support/utils/lexicon';
|
||||||
export * from 'support/utils/object';
|
export * from 'support/utils/object';
|
||||||
export * from 'support/utils/types';
|
export * from 'support/utils/types';
|
||||||
|
|||||||
@@ -232,9 +232,11 @@ const addRemoveTargetContentBetweenElmsFn = async () => {
|
|||||||
await addRemoveElementsTest(targetContentBetweenElmsSlot, targetElmContentElmObservations);
|
await addRemoveElementsTest(targetContentBetweenElmsSlot, targetElmContentElmObservations);
|
||||||
};
|
};
|
||||||
const addImgElmsFn = async () => {
|
const addImgElmsFn = async () => {
|
||||||
|
/*
|
||||||
const add = async () => {
|
const add = async () => {
|
||||||
const img = new Image(1, 1);
|
const img = new Image(1, 1);
|
||||||
img.src = 'data:image/gif;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs=';
|
img.src = 'data:image/gif;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs=';
|
||||||
|
|
||||||
const { before, after, compare } = changedThrough(targetElmContentElmObservations);
|
const { before, after, compare } = changedThrough(targetElmContentElmObservations);
|
||||||
const imgHolder = createDiv('img');
|
const imgHolder = createDiv('img');
|
||||||
appendChildren(imgHolder, img);
|
appendChildren(imgHolder, img);
|
||||||
@@ -261,6 +263,21 @@ const addImgElmsFn = async () => {
|
|||||||
await add();
|
await add();
|
||||||
await add();
|
await add();
|
||||||
await add();
|
await add();
|
||||||
|
*/
|
||||||
|
const add = async () => {
|
||||||
|
const img = new Image(1, 1);
|
||||||
|
img.src = 'data:image/gif;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs=';
|
||||||
|
|
||||||
|
//const { before, after, compare } = changedThrough(targetElmContentElmObservations);
|
||||||
|
const imgHolder = createDiv('img');
|
||||||
|
appendChildren(imgHolder, img);
|
||||||
|
|
||||||
|
appendChildren(imgElmsSlot, imgHolder);
|
||||||
|
};
|
||||||
|
|
||||||
|
add();
|
||||||
|
add();
|
||||||
|
add();
|
||||||
};
|
};
|
||||||
const iterateTargetAttrChange = async () => {
|
const iterateTargetAttrChange = async () => {
|
||||||
await iterateAttrChange(setTargetAttr, targetElmObservations, (observation, selected) => {
|
await iterateAttrChange(setTargetAttr, targetElmObservations, (observation, selected) => {
|
||||||
@@ -340,7 +357,10 @@ createDOMObserver(
|
|||||||
{
|
{
|
||||||
_observeContent: true,
|
_observeContent: true,
|
||||||
_eventContentChange: () => {
|
_eventContentChange: () => {
|
||||||
return [['img', 'load']];
|
return [
|
||||||
|
['img', 'load'],
|
||||||
|
['iframe', 'load'],
|
||||||
|
];
|
||||||
},
|
},
|
||||||
_ignoreContentChange: (mutation) => {
|
_ignoreContentChange: (mutation) => {
|
||||||
const { target, attributeName } = mutation;
|
const { target, attributeName } = mutation;
|
||||||
|
|||||||
@@ -77,9 +77,11 @@ body {
|
|||||||
}
|
}
|
||||||
|
|
||||||
.img {
|
.img {
|
||||||
|
display: inline-block;
|
||||||
background: lime;
|
background: lime;
|
||||||
width: 50px;
|
width: 50px;
|
||||||
height: 50px;
|
height: 50px;
|
||||||
|
border-radius: 100%;
|
||||||
|
|
||||||
img {
|
img {
|
||||||
opacity: 0;
|
opacity: 0;
|
||||||
|
|||||||
Reference in New Issue
Block a user