JSPM

html-traits-on

0.0.0
  • ESM via JSPM
  • ES Module Entrypoint
  • Export Map
  • Keywords
  • License
  • Repository URL
  • TypeScript Types
  • README
  • Created
  • Published
  • Downloads 1
  • Score
    100M100P100Q25420F
  • License MIT

A trait to listen to events and perform an action or submit a form.

Package Exports

  • html-traits-on
  • html-traits-on/index.js

This package does not declare an exports field, so the exports above have been automatically detected and optimized by JSPM instead. If any package subpath is missing, it is recommended to post an issue to the original package (html-traits-on) to support the "exports" field. If that is not possible, create a JSPM override to customize the exports field for this package.

Readme

@html-traits/on

See an example https://jon49.github.io/form-subscribe/.

Why?

I use this with my html-form library. I mainly use it to submit forms or perform some small UI interactions based off of events that happen elsewhere on the page.

Overview

The on html trait provides a flexible mechanism for handling events and reacting to those events, either by doing a requestSubmit command against the attached form or the form of the submitting form child element. If the data-action attribute is attached it will instead run that action.

It also includes conditional checks on the event data and debouncing.

Usage

<form
    traits="on"
    data-events="load submit"
    data-match="detail: { value: 'valid' }"
    data-action="app.handleFormSubmit()">
  <!-- Form content goes here -->
</form>
  • data-events: Specifies the events to listen for. In this case it will call the action immediately when loaded, then it will wait for the submit action.
  • data-match: Specifies conditions for the event to match.
  • data-action: Calls the window attached app.handleFormSubmit() function. met.

If data-action is not present it will call requestSumbit(submitter) on the attached form.

Actions are called with the variables event (the event), $ (same as document.querySelector), $$ (same as document.querySelectorAll), this the element that the trait is attached to.

Examples

Example 1: Action

<p 
  traits="on"
  data-events="load itemAdded"
  data-action="this.innerText = `There are ${myList.childElementCount} items.`"
  >
</p>
<input
  id="myInput"
  traits="on"
  data-events="keydown"
  data-target-el="myInput"
  data-debounce="500"
  data-action="
    if (event.key !== 'Enter') return;
    let li = document.createElement('li');
    li.innerText = this.value;
    myList.append(li);
    this.value = '';
    let newItemEvent = new CustomEvent('itemAdded');
    this.dispatchEvent(newItemEvent);
    " >
<ul id="myList">
</ul>

This example is pushing the limits of this pattern. But what it does, it has an input which adds items to myList on enter. It has a debounce rate of 500 milliseconds before it will respond. Then the p element will say how many items there are, it first writes teh value on document load, then anytime the itemAdded event is dispatched. It is a bit cumbersome, but for little scripts this is great. If you find you need complicated scripts like this all over then it might be time to pick a different library. But if you just have one to three lines of code then this is a great pattern.

Example 2: Basic Usage

<form
    id="my-form"
    traits="on"
    data-events="submit"
    data-match-not="target: { id: 'my-form' }"
    >
  <!-- Form content goes here -->
</form>

In this example, the form will request a submit on the "submit" event. Except when itself is submitted.

Example 3: Conditional Execution

<form
    traits="on"
    data-events="input"
    data-match="target: { value: { length: 10} }"
    data-action="handleInputChange(event)">
  <!-- Form content goes here -->
</form>

This example triggers the handleInputChange function only when the length of the input value is 10.

Example 4: Debouncing

<form
    on="form-subscribe"
    data-events="input"
    data-debounce="500"
    data-action="handleInputDebounced(this, event)">
  <!-- Form content goes here -->
</form>

The handleInputDebounced function will be called with a debounce of 500 milliseconds, preventing rapid consecutive calls.