123456789101112131415161718192021222324252627282930313233343536373839404142434445464748 |
- /**
- * @file
- * Adapted from underscore.js with the addition Drupal namespace.
- */
- /**
- * Limits the invocations of a function in a given time frame.
- *
- * The debounce function wrapper should be used sparingly. One clear use case
- * is limiting the invocation of a callback attached to the window resize event.
- *
- * Before using the debounce function wrapper, consider first whether the
- * callback could be attached to an event that fires less frequently or if the
- * function can be written in such a way that it is only invoked under specific
- * conditions.
- *
- * @param {function} func
- * The function to be invoked.
- * @param {number} wait
- * The time period within which the callback function should only be
- * invoked once. For example if the wait period is 250ms, then the callback
- * will only be called at most 4 times per second.
- * @param {bool} immediate
- * Whether we wait at the beginning or end to execute the function.
- *
- * @return {function}
- * The debounced function.
- */
- Drupal.debounce = function (func, wait, immediate) {
- let timeout;
- let result;
- return function (...args) {
- const context = this;
- const later = function () {
- timeout = null;
- if (!immediate) {
- result = func.apply(context, args);
- }
- };
- const callNow = immediate && !timeout;
- clearTimeout(timeout);
- timeout = setTimeout(later, wait);
- if (callNow) {
- result = func.apply(context, args);
- }
- return result;
- };
- };
|