UNPKG

docsify

Version:

A magical documentation generator.

158 lines (137 loc) 3.94 kB
import { isFn } from '../util/core.js'; /** @type {Record<string, Element>} */ const cacheNode = {}; /** * Get Node * @param {String|Element} el A DOM element * @param {Boolean} noCache Flag to use or not use the cache * @return {Element} The found node element */ export function getNode(el, noCache = false) { if (typeof el === 'string') { if (typeof window.Vue !== 'undefined') { return find(el); } el = noCache ? find(el) : cacheNode[el] || (cacheNode[el] = find(el)); } return el; } /** * * @param {*} el the target element or the selector * @param {*} content the content to be rendered as HTML * @param {*} replace To replace the content (true) or insert instead (false) , default is false */ /** * @param {string|Element} el * @param {string} content * @param {boolean} [replace] */ export function setHTML(el, content, replace) { const node = getNode(el); if (node) { node[replace ? 'outerHTML' : 'innerHTML'] = content; } } export const $ = document; export const body = $.body; export const head = $.head; /** * Find the first matching element * @param {string|Element} el The root element on which to perform the query * from, or a query string to query from `document`. * @param {string} [query] The query string to use on `el` if `el` is an * element. * @returns {Element} The found DOM element * @example * find('nav') => document.querySelector('nav') * find(nav, 'a') => nav.querySelector('a') */ export function find(el, query = ':is()') { return /** @type {Element} */ ( typeof el !== 'string' ? el.querySelector(query) : $.querySelector(el) ); } /** * Find all matching elements * @param {string|Element} el The root element on which to perform the query * from, or a query string to query from `document`. * @param {string} [query] The query string to use on `el` if `el` is an * element. * @returns {Array<Element>} An array of DOM elements * @example * findAll('a') => Array.from(document.querySelectorAll('a')) * findAll(nav, 'a') => Array.from(nav.querySelectorAll('a')) */ export function findAll(el, query = ':is()') { return Array.from( typeof el !== 'string' ? el.querySelectorAll(query) : $.querySelectorAll(el), ); } /** * @param {string} node * @param {string} [tpl] * @returns {HTMLElement} */ export function create(node, tpl) { const element = $.createElement(node); if (tpl) { element.innerHTML = tpl; } return element; } /** * @param {Element} target * @param {Element} el */ export function appendTo(target, el) { return target.appendChild(el); } /** * @param {Element} target * @param {Element} el */ export function before(target, el) { return target.insertBefore(el, target.children[0]); } /** * @param {any} el * @param {any} type * @param {any} [handler] */ export function on(el, type, handler) { isFn(type) ? window.addEventListener(el, type) : el.addEventListener(type, handler); } /** * @param {any} el * @param {any} type * @param {any} [handler] */ export function off(el, type, handler) { isFn(type) ? window.removeEventListener(el, type) : el.removeEventListener(type, handler); } /** * @param {string} content */ export function style(content) { appendTo(head, /** @type {Element} */ (create('style', content))); } /** * Fork https://github.com/bendrucker/document-ready/blob/master/index.js * @param {(event: Event) => void} callback The callbacack to be called when the page is loaded * @returns {number|void} If the page is already loaded returns the result of the setTimeout callback, * otherwise it only attaches the callback to the DOMContentLoaded event */ export function documentReady(callback, doc = document) { const state = doc.readyState; if (state === 'complete' || state === 'interactive') { return setTimeout(callback, 0); } doc.addEventListener('DOMContentLoaded', callback); }