# DOM-Helfer: ATTRD, HIDDEN, VISIBLE, WIDTH, STYLE, NODEMOVE, DIFFDOM und APPEARANCE

> Lies data-Attribute, frage, ob ein Element angezeigt wird oder auf dem Bildschirm ist, füge ersetzbare Styles hinzu, verschiebe Elemente in ihrem Elternelement, aktualisiere eine Liste ohne Neuzeichnen und setze Farben und Dunkelmodus der Seite.

Framework: jcomponent20
Product: jComponent 20 (jcomponent@20)
Language: de
Content-SHA256: f7e371d3860c4e40c97476f7db9acc22be79a5afeca5717b8dd449cd2412fba6
Snapshot: c0700e321579725c5cf4f5ace1ad7d2866d1b4f93c24a63c0b41b6b7998e976c
Sources: jcomponent20@3fedd009a277f50fddc608b97afbec553b67c51b
Review: not-recorded

- `ATTRD(element or event, [name])` liest `data-<name>` (Standard `data-id`) eines Elements, eines jQuery-Objekts oder des Elements eines Ereignisses; bei einem einfachen Objekt liest es die Eigenschaft.
- `HIDDEN(element)` ist `true`, wenn das Element nicht angezeigt wird (es oder ein Elternelement hat `display: none`; **ein Element, das direktes Kind des body ist, wird immer als nicht verborgen gemeldet**, die Prüfung beginnt bei seinem Elternelement); `VISIBLE(element, [threshold], [mode])` ist `true`, wenn es im sichtbaren Teil des Fensters liegt (`mode` `'above'` oder `'below'` fragt, wo es ist, wenn nicht). `NOTFOCUSED()` ist `true`, wenn der Browser-Tab im Hintergrund ist, und `inDOM(element)` ist wahr, solange das Element im Dokument ist.
- `WIDTH([element])` gibt die Größenklasse der Breite des Elements zurück (Standard: das Fenster): `'xs'`, `'sm'`, `'md'` oder `'lg'` (die Grenzen stehen in `DEF.devices`). `WW` und `WH` sind die Größe des Fensters; `$W` ist das jQuery-Objekt des Fensters; `SCROLLBARWIDTH()` ist die Breite, die eine Scrollleiste einnimmt.
- `SCROLLBAR(element, [options])` umhüllt ein Element mit einer eigenen Scrollleiste und gibt es zurück; `scrollbar.resize()` berechnet sie neu, nachdem sich der Inhalt geändert hat.
- `isTOUCH`, `isMOBILE`, `isROBOT`, `isSTANDALONE`, `isPRIVATEMODE` und `isIE` sind Booleans über den Browser, die beim Start der Seite gesetzt werden.
- `STYLE(css, [id], [selector])` fügt dem Head ein `<style>` hinzu. Mit einer `id` wird der Style ersetzt, wenn du ihn erneut mit derselben ID aufrufst; mit einem `selector` wird jede Regel davon umhüllt (`'.a { }'` wird zu `'#p .a{ }'`).
- `NODEINDEXOF(element)` ist die Position des Elements unter seinen Geschwistern, `NODEINSERT(element, reference, [before])` verschiebt ein Element hinter (oder vor) ein anderes und `NODEMOVE(element, [up])` verschiebt es eine Stelle nach unten (oder oben).
- `DIFFDOM(parent, selector, html, [attribute])` macht die Kinder von `parent`, die zu `selector` passen, gleich denen in `html`, **ohne** die bereits vorhandenen **neu zu zeichnen**: Ein Element ist dasselbe, wenn sein `attribute` denselben Wert hat (ohne `attribute`, wenn sein gesamtes HTML gleich ist). Es entfernt die, die nicht in der neuen Liste sind, fügt die neuen hinzu, bringt sie in die Reihenfolge von `html` und gibt `{ add, upd, rem }` zurück. Der Inhalt eines beibehaltenen Elements wird **nicht** ersetzt.
- `APPEARANCE({ color, dark, large, <name>: value })` setzt das Aussehen der Seite: `dark` und `large` schalten die Klassen `ui-dark` und `ui-large` des body um, `color` und jeder andere Schlüssel werden zu CSS-Variablen von `:root` (`--color`, und `--rgb` wird aus der Farbe berechnet) in einem einzigen `<style id="cssappearance">`.
- `ENVIRONMENT(name, version, language, [env])` setzt den Namen, der den Schlüsseln in `localStorage` vorangestellt wird, die Version und die Sprache (`DEF.localstorage`, `DEF.version`, `DEF.language`) und mit `env` mehrere `ENV()`-Werte.

```html public/index.html
<!DOCTYPE html>
<html>
<head>
	<meta charset="utf-8" />
	<title>jComponent</title>
	<link rel="stylesheet" href="//cdn.componentator.com/spa.min@20.css" />
	<script src="//cdn.componentator.com/spa.min@20.js"></script>
</head>
<body>
	<p id="p">A paragraph</p>
	<div id="shown" style="width:300px;height:40px">Shown</div>
	<div id="hidden" style="display:none"><span id="inside">Inside</span></div>
	<div id="far" style="margin-top:3000px">Far away</div>
	<div id="box" style="width:200px;height:50px;overflow:auto"><div style="height:300px">tall</div></div>
	<ul id="list"><li id="a" data-id="a">a</li><li id="b" data-id="b">b</li><li id="c" data-id="c">c</li></ul>
	<ul id="diff"><li data-id="1">one</li><li data-id="2">two</li></ul>
</body>
</html>
```
