okiba-gang/okiba

View on GitHub
packages/dom/utils.js

Summary

Maintainability
A
25 mins
Test Coverage
import { castArray } from '@okiba/arrays'
/**
 * Memo used to cache properties and methods trough the module
 */
const memo = {}

export function getMatcher() {
  if (!memo.matcher) {
    for (const k of [
      'matchesSelector',
      'mozMatchesSelector',
      'msMatchesSelector',
      'oMatchesSelector',
      'webkitMatchesSelector'
    ]) {
      if (k in Element.prototype) {
        memo.matcher = k
        break
      }
    }
  }

  return memo.matcher
}

/**
 * Generic event add/removal factory
 */
export function eventBuilder(source, type, handler, action, options) {
  if (!type || !handler) return false

  const elements = castArray(source)
  const types = castArray(type)
  const handlers = castArray(handler)

  for (let i = 0; i < elements.length; ++i) {
    for (let j = 0; j < types.length; ++j) {
      elements[i][`${action}EventListener`](types[j], handlers[Math.min(j, handlers.length - 1)], options)
    }
  }

  return true
}