2
0
mirror of https://github.com/tenrok/vue-context.git synced 2026-06-07 22:32:23 +03:00
Files
vue-context/src/js/utils.js
T
2019-11-14 13:38:00 -06:00

96 lines
2.4 KiB
JavaScript

if (! Array.from) {
Array.from = object => {
'use strict';
return [].slice.call(object);
};
}
if (! Array.isArray) {
Array.isArray = arg => Object.prototype.toString.call(arg) === '[object Array]';
}
// --- Constants ---
const arrayFrom = Array.from;
export const isArray = Array.isArray;
export const keyCodes = {
ESC: 27,
LEFT: 37,
UP: 38,
RIGHT: 39,
DOWN: 40
};
// --- Dom Utils ---
// Returns true if the parent element contains the child element
const contains = (parent, child) => {
if (! parent || typeof parent.contains !== 'function') {
return false;
}
return parent.contains(child);
};
// Attach an event listener to an element
export const eventOn = (el, eventName, handler) => {
if (el && el.addEventListener) {
el.addEventListener(eventName, handler);
}
};
// Remove an event listener from an element
export const eventOff = (el, eventName, handler) => {
if (el && el.removeEventListener) {
el.removeEventListener(eventName, handler);
}
};
// Filter visible elements
export const filterVisible = elements => (elements || []).filter(isVisible);
// Return the Bounding Client Rect of an element
// Returns `null` if not an element
export const getBCR = el => (isElement(el) ? el.getBoundingClientRect() : null);
// Determine if an element is an HTML element
const isElement = el => Boolean(el && el.nodeType === Node.ELEMENT_NODE);
// Determine if an HTML element is visible - Faster than CSS check
const isVisible = el => {
if (! isElement(el) || ! contains(document.body, el)) {
return false;
}
if (el.style.display === 'none') {
return false;
}
const bcr = getBCR(el);
return Boolean(bcr && bcr.height > 0 && bcr.width > 0);
};
// Select all elements matching a selector. Returns `[]` if none found
export const selectAll = (selector, root) =>
arrayFrom((isElement(root) ? root : document).querySelectorAll(selector));
// Set an attribute on an element
export const setAttr = (el, attr, value) => {
if (attr && isElement(el)) {
el.setAttribute(attr, value);
}
};
export const parentElementByClassName = (element, className) => {
let parentElement = element.parentElement;
while (parentElement !== null && !parentElement.classList.contains(className)) {
parentElement = parentElement.parentElement;
}
return parentElement;
};