npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

@okiba/dom

v1.0.26

Published

DOM helpers for okiba.js

Downloads

124

Readme

Okiba / dom

Utilities to work with dom elements and selectors

__

Installation

npm i --save @okiba/dom

Or import it directly in the browser

<script type="module" src="https://unpkg.com/@okiba/dom/index.js"></script>

Usage

import dom from '@okiba/dom'

Untranspiled code 🛑

Okiba Core packages are not transpiled, so don't forget to transpile them with your favourite bundler. For example, using Babel with Webpack, you should prevent imports from okiba to be excluded from transpilation, like follows:

{
  test: /\.js$/,
  exclude: /node_modules\/(?!(@okiba)\/).*/,
  use: {
    loader: 'babel-loader',
    options: {
      presets: ['@babel/preset-env']
    }
  }
}

byId(id)

Selects a DOM Element with a certain id

import {byId} from '@okiba/dom'
const apple = byId('apple')
console.log(apple) // [div.apple]

Arguments

+ id: String

DOM id you are looking for

Returns

Element A DOM Element matching id

qs(selector, element)

Selects a DOM Element, scoped to element

import {qs} from '@okiba/dom'
const pear = qs('.pear')
console.log(pear) // [div.pear]

Arguments

+ selector: String

DOM Selector (tag, class, id, anything that can be passed to querySelector API)

+ element: Element | optional - default: document

DOM Element to scope the selection query, only childs of that element will be tageted

Returns

Element A DOM Element matching selector

qsa(selector, element)

Selects an array of DOM Elements, scoped to element

import {qsa} from '@okiba/dom'
const fruits = qsa('.fruit')
console.log(fruits) // [div.fruit, div.fruit]

Arguments

+ selector: String

DOM Selector (tag, class, id, anything that can be passed to querySelector API)

+ element: Element | optional - default: document

DOM Element to scope the selection query, only childs of that element will be tageted

Returns

Array.<Element> An array of DOM elements matching selector

on(window, type, handler)

Attaches an event listener to a DOM Element, or an array of.

import {qsa, on} from '@okiba/dom'
const buttons = qsa('.button')

on(buttons, 'click', onClick)
on(buttons, ['mouseenter', 'mouseleve'], onMouseChange)

// adds `onClick` to 'click' and `onMouseChange` to both 'mouseenter' and 'mouseleave'
on(buttons, ['click', mouseenter', 'mouseleve'], [onClick, onMouseChange])

Arguments

+ window: Element or Array.<Element> | optional

source the element which will trigger the event

+ type: String or Array.<String>

the event name to bind. Or an array of

+ handler: function or Array.<function()>

the callback to be fired at the event. If an array is supplied the handlers will be bound in order, if there are less handlers than event types, the last handler is bound to all remaining events.

Returns

Boolean Success of the binding

off(window, type, handler)

Detached an event listener from a DOM Element, or an array of.

import {qs, off} from '@okiba/dom'
const button = qs('.button')

button.addEventListener('click', onButtonClick)
// or okiba's `on` on(button, 'click')

off(button, 'click', onButtonClick)

// removes `onMouseChange` from both 'mouseenter' and 'mouseleave'
off(buttons, ['mouseenter', 'mouseleve'], onMouseChange)

// removes `onClick` from 'click' and `onMouseChange` from both 'mouseenter' and 'mouseleave'
off(buttons, ['click', mouseenter', 'mouseleve'], [onClick, onMouseChange])

Arguments

+ window: Element or Array.<Element> | optional

source Element which will trigger the event

+ type: String or Array.<String>

Event name to unbind. Or an array of

+ handler: function or Array.<function()>

Callback bound to the event. If an array is supplied the handlers will be unbound in order, if there are less handlers than event types, the last handler is unbound from all remaining events.

Returns

Boolean Success of the unbinding

eventCoords(DOM)

Read mouse and touch position in the same way

import {eventCoords, on} from '@okiba/dom'
on(window, ['mousemove', 'touchmove'], onMove)

function onMove(e){
 const coords = eventCoords(e)
 console.log(coords)
}

Arguments

+ DOM: Event

Event

Returns

Object Event position coordinates (clientX and ClientY)

offset(el)

Gets top and left offsets of an element

import {qs, offset} from '@okiba/dom'
const el = qs('.something')
const offsets = offset(el)
console.log(offsets) // Logs: {top: 100, left: 100}

Arguments

+ el: Element

The element you want to get offsets of

Returns

Object Object containing top and left offsets

getElements(target)

Useful to normalize parameters accepted by modules which work with dom nodes. If you need to have an array of Elements and you want to accept any of: String, String array, Element, Element array

import {qs, getElements} from '@okiba/dom'
const els1 = getElements(['.some', '#thing']) // => [div.some, span#it]

const el = qs('.element')
const els2 = getElements(el) // => [el]

Arguments

+ target: String or Array.<String> or Element or Array.<Element>

The target you want to be sure to obtain as an array of Elements

Returns

Array.<Element> An array of Elements

matches(el, selectors, testAncestors)

Checks if an element matches at least one in a list of selectors.

import {matches} from '@okiba/dom'

const isInternal = !!matches(a, '.internal')
//...
const match = matches(myDiv, ['.red', '.green', '.blue])
myDiv.style.backgroundColor = match.replace('.', '')

Arguments

+ el: Element

Element to check

+ selectors: String or Array

Selector (ora array thereof) which the element should match

+ testAncestors: Boolean

If true, extends match test upward in the ancestors

Returns

String First matching selector, null if there was no match

isChildOf(el, target)

Check if a given element is child of another. The target to match can be an element, selector, or array of selectors.

import {isChildOf} from '@okiba/dom'

const isChildOfAnchor = isChildOf(myNode, 'a')
//... or
const isInsideButton = isChildOf(myNode, myButton)

Arguments

+ el: Element

Element to check

+ target: Element or String or Array.<String>

Selector to match or Element checked for parent relationship

Returns

Boolean Boolean of match found

delegate(target, event, callback, options, context)

Delegate an event callback. It will be executed only if the event target has an ancestor which matches the given target

import {delegate} from '@okiba/dom'

const undelegate = delegate('a.internal-navigation', 'click', onNavigationClick, {capture: true})

function disableNavigation() {
  undelegate()
}

Arguments

+ target: String or Element

Selector or Element to match

+ event: String

Event to bind to

+ callback: function

Function to be executed at match

+ options: Object or Boolean

Options to be to on

+ context: Window or HTMLDocument or HTMLElement

Delegation root element

Returns

function Function to be called to remove the delegated callback

createCustomEvent(type, options)

Custom event factory. Creates a cross-browsers compatible custom event instance

import {createCustomEvent} from '@okiba/dom'

const enemy = document.getElementById('enemy')
const shinobiAttack = createCustomEvent('shinobi-attack', {
 detail: { damage: 3 }
})

enemy.setAttribute('data-life-points', 100)

enemy.addEventListener('shinobi-attack', e => {
 const currentLifePoints = enemy.getAttribute('data-life-points')
 const updatedlifePoints = Math.max(0, currentLifePoints - e.detail.damage)
 enemy.setAttribute('data-life-points', updatedlifePoints)
})

enemy.dispatchEvent(shinobiAttack)

console.log(enemy.getAttribute('data-life-points')) // Logs: 97

Arguments

+ type: String

The custom event type

+ options: Object

The custom event options

Returns

CustomEvent The custom event instance