Ombyggnad 2026/2027 pågår - döda länkar förekommer. Mer information

Two Paradigms for Enhancing HTML Tags

(Extern länk)

Tipsad 2026-04-30 på Anders Ytterströms webblogg

Avlärande av Unobtrusive JavaScript

Jag ägnade de bästa åren av karriären åt att tillämpa Unobtrusive JavaScript.

Det är ett verktyg som för att uppnå två saker:

Jag blev därför litet provocerad när denna artikel nämner detta som ett förlegat, dåligt sätt. De nämner detta exempel (ändrat av mig för att vara mer korrekt i tiden, men poängen kvarstår):

<script defer>
  const someForm = document.querySelectorAll("[data-thing-form]")
  // do stuff with the forms on the page
</script>

<form data-thing-form>
  ...
</form>

Poängen är dock helt korrekt.

The reason this is bad is because you are brute-forcing the execution of the code in an imperative way, rather than using a declarative technique to execute the code whenever the relevant tag shows up. First of all, you likely want this code living in a tree of JS files somewhere else, rather than in a script tag next to the form. You might want the code to apply to various sorts of forms, not just one form with a particular ~ID~ data attribute (min ändring). Plus this technique will completely break at any time you use reactivity or hypermedia: what if the form comes in via a fragment after the page has loaded? Will your code know that an ajax fragment has suddenly resulted in a DOM update?

De två alternativen är enastående. Det som går att använda redan idag är vad jag kommer att använda från och med nu.

<script defer>
  export class ThingFormElement extends HTMLElement {
    // do stuff with the forms on the page
  }
</script>

<thing-form>
  <form>
      ...
  </form>
</thing-form>

Elegant!

Jag lärde mig mig också att customElements.define retroaktivt initierar alla förekomster av elementet i dokumentet. Det går alltså att behålla defer, om det är viktigt.


Ovanstående länktips publicerades 2026-04-30. Det går att prenumerera på länktips. Härifrån är följande mål rekommenderade: