mirror of
https://github.com/tenrok/vue-context.git
synced 2026-06-07 22:32:23 +03:00
96 lines
2.4 KiB
JavaScript
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;
|
|
};
|