@ideal-postcodes/jsutil
Version:
Browser Address Autocomplete for api.ideal-postcodes.co.uk
86 lines (85 loc) • 2.82 kB
JavaScript
import { isString } from "./string";
export const hasWindow = () => typeof window !== "undefined";
export const toArray = (nodeList) => Array.prototype.slice.call(nodeList);
export const loaded = (elem, prefix = "idpc") => elem.getAttribute(prefix) === "true";
export const markLoaded = (elem, prefix = "idpc") => elem.setAttribute(prefix, "true");
const isTrue = () => true;
export const getParent = (node, entity, test = isTrue) => {
let parent = node;
const tagName = entity.toUpperCase();
while (parent.tagName !== "HTML") {
if (parent.tagName === tagName && test(parent))
return parent;
if (parent.parentNode === null)
return null;
parent = parent.parentNode;
}
return null;
};
export const toHtmlElem = (parent, selector) => (selector ? parent.querySelector(selector) : null);
export const getAnchors = (selector, d) => {
const matches = (d || window.document).querySelectorAll(selector);
const anchors = toArray(matches).filter((e) => !loaded(e));
if (anchors.length === 0)
return [];
anchors.forEach((anchor) => markLoaded(anchor));
return anchors;
};
export const insertBefore = ({ elem, target }) => {
const parent = target.parentNode;
if (parent === null)
return;
parent.insertBefore(elem, target);
return elem;
};
export const toElem = (elem, context) => {
if (isString(elem))
return context.querySelector(elem);
return elem;
};
const d = () => window.document;
export const getScope = (scope) => {
if (isString(scope))
return d().querySelector(scope);
if (scope === null)
return d();
return scope;
};
export const getDocument = (scope) => {
if (scope instanceof Document || scope.constructor.name === "HTMLDocument")
return scope;
if (scope.ownerDocument)
return scope.ownerDocument;
return d();
};
export const setStyle = (element, style) => {
const currentRules = element.getAttribute("style");
Object.keys(style).forEach((key) => (element.style[key] = style[key]));
return currentRules;
};
export const restoreStyle = (element, style) => {
element.setAttribute("style", style || "");
};
export const hide = (e) => {
e.style.display = "none";
return e;
};
export const show = (e) => {
e.style.display = "";
return e;
};
export const remove = (elem) => {
if (elem === null || elem.parentNode === null)
return;
elem.parentNode.removeChild(elem);
};
export const contains = (scope, selector, text) => {
const elements = scope.querySelectorAll(selector);
for (let i = 0; i < elements.length; i++) {
const e = elements[i];
const content = e.innerText;
if (content && content.trim() === text)
return e;
}
return null;
};