DOM Basics
Table of Contents
- Creating DOM Elements and Fragments
 - Element Attributes
 - Adding children to an existing element
 - Reading from the DOM
 - Supported HTML tags
 - Further Reading
 
Creating DOM Elements and Fragments
Let's create a <button> as a child of the <body> element and set its text:
fun main() {
    Kweb(port = 16097) {
        doc.body {
            button().text("Click Me!")
        }
    }
}
The Kweb DSL can be used to create nested elements:
Kweb(port = 16097) {
    doc.body {
        table {
            tr {
                th().text("Name")
                th().text("Age")
            }
            tr {
                td().text("Alice")
                td().text("21")
            }
            tr {
                td().text("Bob")
                td().text("22")
            }
        }
    }
}
Element Attributes
If you assign the button element to a val then you can also set its attributes:
val button = button()
button.text("Click Me!")
button.classes("bigbutton")
button["autofocus"] = true
Or delete it:
button.delete()
Adding children to an existing element
The DSL syntax makes it very easy to create elements and their children together:
ul {
    li().text("One")
    li().text("Two")
}
The created
Element is passed to the
{block} as a parameter, which can be used to set attributes on the element, add
listeners, or set the element's text or innerHtml:
button { btnEl ->
    with(btnEl) {
        classes("bigbutton")
        this["autofocus"] = true
        text("Click Me!")
    }
}
We can also use the new {} function to add children to a pre-existing Element:
val unorderedList : ULElement = ul()
unorderedList.new {
    li().text("One")
    li().text("Two")
}
Reading from the DOM
Kweb can also read from the DOM, in this case the value of an <input>
element:
val input: InputElement = input(type = InputType.text)
// A KVar is a mutable value to which you can add listeners
val inputKVar = input.value
inputKVar.addListener { old, new ->
    println("Input changed from $old to $new")
}
Events can evaluate a JavaScript expression and send the result to the server, in this case we give it an expression that will retrieve the value of an InputElement, conveniently provided by valueJsExpression.
Note: See the Observer Pattern & State section for another way to read input element values.
Supported HTML tags
Kweb supports a significant subset of HTML tags like button(), p(), a(), table(), and so on. You can find a more complete list in prelude.kt (scroll down to the Functions section). This provides a nice statically-typed HTML DSL, fully integrated with the Kotlin language.
If a tag doesn't have explicit support in Kweb that's not a problem. For example, here is how you might use the infamous and now-obsolete <blink> tag:
element("blink") {
    span().text("Blinking Text")
}
Further Reading
The Element class provides many other useful ways to interact with DOM elements.