lang/js/ InputChangeDetection
Use addEventListener("input", e => { ... })
.
Example
textarea.changed {
border: 5px solid red;
}
const shortcuts = new Map()
addEventListener("load",_ => {
addEventListener("keydown", e => {
let ae = document.activeElement.tagName.toLowerCase()
// sometimes backquote sends key == ¬
let k = e.key.toLowerCase()
if( e.code == "Backquote" ) k = "backquote" // so we get
let t = k // we save k so that we can see if a single key was pressed -- we ignore keypresses when in an input
if( t === "control" || t === "shift" || t === "alt" || t === "meta" ) return true
// M-A-C-S
if( e.shiftKey ) t = "S-"+t
if( e.ctrlKey ) t = "C-"+t
if( e.altKey ) t = "A-"+t
if( e.metaKey ) t = "M-"+t
if( ( ae == "textarea" || ae == "input" ) && ! ( e.ctrlKey | e.altKey | e.metaKey ) ) {
// if typing into a textarea or input, ignore keys unless ctrl alt or meta is held
return true
}
if( t === "C-r" ) return true
if( shortcuts.has(t) ) { return shortcuts.get(t)(e) }
})
})
// clean/dirty
addEventListener("load", _ => {
const textarea = document.querySelector("textarea")
let changed = false
const update = _ => {
if( changed ) textarea.classList.add("changed")
else textarea.classList.remove("changed")
}
const clean = _ => {
changed = false
update()
}
const dirty = _ => {
changed = true
update()
}
shortcuts.set("C-s", e => {
e.preventDefault()
clean()
})
textarea.addEventListener("input", e => {
dirty()
})
})