{
"import": [
"mizchi/js",
"mizchi/js_browser/dom"
]
}let doc = @dom.document()
let div = doc.createElement("div")
div.set_attribute("id", "app")
div.set_attribute("class", "container")
let text = doc.createTextNode("Hello, World!")
div.append_child(text.as_element()) |> ignore// Property access
div.set("innerHTML", "Hello World")
let content = div._get("innerHTML")
// Attributes
div.set_attribute("data-value", "123")
let value = div.getAttribute("data-value") // Some("123")
div.removeAttribute("data-value")
// Class manipulation
div.addClass("active")
div.removeClass("inactive")
div.toggleClass("hidden")
inspect(div.containsClass("active")) // true
// DOM properties
div.setId("main")
div.setClassName("app container")
div.setInnerHTML("<span>Content</span>")let parent = element.parent_element()
let children = element.children()
let first = element.first_child()
let last = element.last_child()
let next = element.next_sibling()
let prev = element.previous_sibling()
// Element-only traversal (skips text nodes)
let first_elem = element.first_element_child()
let next_elem = element.next_element_sibling()let doc = @dom.document()
// Single element
let el = doc.query_selector("#app")
match el {
Some(element) => element.set_text_content("Found!")
None => ()
}
// By ID
let element = doc.get_element_by_id("main")
// Multiple elements
let elements = doc.query_selector_all(".item")
let by_tag = doc.get_elements_by_tag_name("div")
let by_class = doc.get_elements_by_class_name("container")fn handle_click(event : @dom.Event) -> Unit {
event.prevent_default()
event.stop_propagation()
let target = event.target()
target.set_text_content("Clicked!")
}
element.addEventListener("click", handle_click)
// Remove listener
element.removeEventListener("click", handle_click)fn handle_mouse(event : @dom.MouseEvent) -> Unit {
let x = event.client_x()
let y = event.client_y()
let button = event.button()
if event.ctrl_key() {
// Handle Ctrl+Click
}
}
element.addEventListener("click", fn(e) {
handle_mouse(e.cast())
})fn handle_keydown(event : @dom.KeyboardEvent) -> Unit {
let key = event.key()
let code = event.code()
if event.ctrl_key() && key == "s" {
event.prevent_default()
// Handle Ctrl+S
}
}// Inline styles
div.set_display("block")
div.set_color("red")
div.set_width("100px")
div.set_height("50px")
div.set_opacity(0.5)
// CSS properties
div.set_style_property("background-color", "blue")
div.set_style_property("border-radius", "5px")
// Get computed style
let computed = @dom.get_computed_style(div)
let color = computed._get("color")container.set_display("flex")
container.set_flex_direction("row")
container.set_justify_content("center")
container.set_align_items("center")
container.set_gap("10px")
// Grid
grid.set_display("grid")
grid.set_grid_template_columns("1fr 2fr 1fr")
grid.set_grid_template_rows("auto")let storage = @dom.get_local_storage()
// Set and get
storage.set_item("user", "Alice")
let user = storage.get_item("user") // Some("Alice")
// Remove
storage.remove_item("user")
// Check existence
if storage.has_item("token") {
// ...
}
// Iterate
let keys = storage.keys()
let values = storage.values()
let entries = storage.entries()
// Clear all
storage.clear()let nav = @dom.navigator()
let ua = nav.user_agent()
let lang = nav.language()
let online = nav.on_line()
let platform = nav.platform()
let cores = nav.hardware_concurrency()let doc = @dom.document()
// Document properties
let title = doc.title()
doc.set_title("New Title")
let url = doc.url()
let domain = doc.domain()
// Body and head
let body = doc.body()
let head = doc.head()
// Create fragment
let fragment = doc.create_document_fragment()// Client dimensions
let width = element.client_width()
let height = element.client_height()
// Scroll dimensions
let scroll_width = element.scroll_width()
let scroll_height = element.scroll_height()
// Scroll position
let scroll_top = element.scroll_top()
element.set_scroll_top(100.0)
// Bounding rect
let rect = element.get_bounding_client_rect()// Clone node
let clone = element.clone_node(true) // deep clone
// Check containment
if parent.contains(child) {
// parent contains child
}
// Compare nodes
if node1.is_equal_node(node2) {
// nodes are equal
}
// Text content
element.set_text_content("New text")
let text = element.text_content()// Setup JSDOM
extern "js" fn require(module_name : String) -> @js.Val =
#| (moduleName) => require(moduleName)
fn setup_jsdom() -> Unit {
let jsdom = require("global-jsdom")
jsdom._call("register", []) |> ignore
}
// Run tests
test "basic DOM operations" {
setup_jsdom()
let doc = @dom.document()
let div = doc.create_element("div")
div.set_attribute("id", "test")
inspect(div.get_attribute("id"), content="Some(\"test\")")
}let div = doc.createElement("div")
div.as_node().appendChild(child.as_node())
div.as_element().setAttribute("class", "container")
div.as_html_element().innerHTML()let div = doc.createElement("div")
div.appendChild(child.as_node())
div.setAttribute("class", "container")
div.innerHTML()pnpm generate:dom
# or
deno run --allow-read --allow-write scripts/generate_dom_inheritance.tsEventTarget
└── Node (appendChild, removeChild, textContent, etc.)
├── Element (querySelector, setAttribute, etc.)
│ ├── HTMLElement (innerHTML, innerText, etc.)
│ │ └── HTMLDivElement, HTMLSpanElement, etc.
│ └── SVGElement
│ └── SVGCircleElement, SVGRectElement, etc.
└── Documentmatch element.parent_element() {
Some(parent) => // Handle parent
None => // No parent
}pub(all) struct AnimationEvent {
animationName : String
elapsedTime : Double
pseudoElement : String
}impl Show for AnimationEvent#external
pub type BeforeUnloadEvent#alias(set_return_value)
fn BeforeUnloadEvent::setReturnValue(self : BeforeUnloadEvent, value : String) -> Unit#external
pub type CSSRulefn CSSStyleDeclaration::get_property_priority(self : CSSStyleDeclaration, property : String) -> Stringfn CSSStyleDeclaration::set_property(self : CSSStyleDeclaration, property : String, value : String) -> Unitfn CSSStyleDeclaration::set_property_priority(self : CSSStyleDeclaration, property : String, value : String, priority : String) -> Unit#external
pub type CSSStyleSheetpub(all) struct ChangeEvent {
}#external
pub type CustomElementRegistryfn CustomElementRegistry::define_(self : CustomElementRegistry, name : String, on_connected? : () -> Unit, on_disconnected? : () -> Unit, on_adopted? : () -> Unit, on_attribute_changed? : (String, String?, String?, String?) -> Unit, observed_attributes? : Array[String], html_element_class? : Any) -> Unitfn CustomElementRegistry::getName(self : CustomElementRegistry, element_constructor : Any) -> String?pub(all) struct DOMRect {
x : Double
y : Double
width : Double
height : Double
top : Double
right : Double
bottom : Double
left : Double
}pub(all) struct DOMRectReadOnly {
x : Double
y : Double
width : Double
height : Double
top : Double
right : Double
bottom : Double
left : Double
}#external
pub type DataTransferItem#external
pub type Document#alias(add_event_listener)
fn Document::addEventListener(self : Document, event_type : String, handler : (Any) -> Unit, capture? : Bool, once? : Bool, passive? : Bool, signal? : AbortSignal) -> Unit#alias(create_document_fragment)
fn Document::createDocumentFragment(self : Document) -> DocumentFragmentfn Document::on(self : Document, event_type : String, handler : (Any) -> Unit, capture? : Bool, once? : Bool, passive? : Bool, signal? : AbortSignal) -> Unit#external
pub type DocumentFragment#external
pub type Element#alias(add_event_listener)
fn Element::addEventListener(self : Element, event_type : String, handler : (Any) -> Unit, capture? : Bool, once? : Bool, passive? : Bool, signal? : AbortSignal) -> Unitfn Element::on(self : Element, event_type : String, handler : (Any) -> Unit, capture? : Bool, once? : Bool, passive? : Bool, signal? : AbortSignal) -> Unit#external
pub type Event#external
pub type FocusEventpub(all) struct HTMLAnchorElement {
href : String
target : String
}#alias(add_event_listener)
fn HTMLAnchorElement::addEventListener(self : HTMLAnchorElement, event_type : String, handler : (Any) -> Unit, capture? : Bool, once? : Bool, passive? : Bool, signal? : AbortSignal) -> Unit#alias(dispatch_event)
fn HTMLAnchorElement::dispatchEvent(self : HTMLAnchorElement, event : Event) -> Boolfn HTMLAnchorElement::getElementsByClassName(self : HTMLAnchorElement, class_name : String) -> Array[Element]fn HTMLAnchorElement::getElementsByTagName(self : HTMLAnchorElement, tag_name : String) -> Array[Element]fn HTMLAnchorElement::insertAdjacentElement(self : HTMLAnchorElement, position : String, element : Element) -> Element?fn HTMLAnchorElement::insertAdjacentHTML(self : HTMLAnchorElement, position : String, html : String) -> Unitfn HTMLAnchorElement::insertAdjacentText(self : HTMLAnchorElement, position : String, text : String) -> Unitfn HTMLAnchorElement::insertBefore(self : HTMLAnchorElement, new_node : Node, ref_node : Node?) -> Nodefn HTMLAnchorElement::moveBefore(self : HTMLAnchorElement, moved_node : Node, ref_node : Node?) -> Unitfn HTMLAnchorElement::off(self : HTMLAnchorElement, event_type : String, handler : (Any) -> Unit, capture? : Bool) -> Unitfn HTMLAnchorElement::on(self : HTMLAnchorElement, event_type : String, handler : (Any) -> Unit, capture? : Bool, once? : Bool, passive? : Bool, signal? : AbortSignal) -> Unitfn HTMLAnchorElement::querySelectorAll(self : HTMLAnchorElement, selector : String) -> Array[Element]#alias(remove_event_listener)
fn HTMLAnchorElement::removeEventListener(self : HTMLAnchorElement, event_type : String, handler : (Any) -> Unit, capture? : Bool) -> Unitfn HTMLAnchorElement::replaceChild(self : HTMLAnchorElement, new_child : Node, old_child : Node) -> Nodefn HTMLAnchorElement::toggleAttribute(self : HTMLAnchorElement, name : String, force? : Bool) -> Bool#external
pub type HTMLBodyElement#alias(add_event_listener)
fn HTMLBodyElement::addEventListener(self : HTMLBodyElement, event_type : String, handler : (Any) -> Unit, capture? : Bool, once? : Bool, passive? : Bool, signal? : AbortSignal) -> Unit#alias(dispatch_event)
fn HTMLBodyElement::dispatchEvent(self : HTMLBodyElement, event : Event) -> Boolfn HTMLBodyElement::getElementsByClassName(self : HTMLBodyElement, class_name : String) -> Array[Element]fn HTMLBodyElement::getElementsByTagName(self : HTMLBodyElement, tag_name : String) -> Array[Element]fn HTMLBodyElement::insertAdjacentElement(self : HTMLBodyElement, position : String, element : Element) -> Element?fn HTMLBodyElement::insertAdjacentHTML(self : HTMLBodyElement, position : String, html : String) -> Unitfn HTMLBodyElement::insertAdjacentText(self : HTMLBodyElement, position : String, text : String) -> Unitfn HTMLBodyElement::off(self : HTMLBodyElement, event_type : String, handler : (Any) -> Unit, capture? : Bool) -> Unitfn HTMLBodyElement::on(self : HTMLBodyElement, event_type : String, handler : (Any) -> Unit, capture? : Bool, once? : Bool, passive? : Bool, signal? : AbortSignal) -> Unit#alias(remove_event_listener)
fn HTMLBodyElement::removeEventListener(self : HTMLBodyElement, event_type : String, handler : (Any) -> Unit, capture? : Bool) -> Unitfn HTMLBodyElement::replaceChild(self : HTMLBodyElement, new_child : Node, old_child : Node) -> Nodepub(all) struct HTMLButtonElement {
disabled : Bool
}#alias(add_event_listener)
fn HTMLButtonElement::addEventListener(self : HTMLButtonElement, event_type : String, handler : (Any) -> Unit, capture? : Bool, once? : Bool, passive? : Bool, signal? : AbortSignal) -> Unit#alias(dispatch_event)
fn HTMLButtonElement::dispatchEvent(self : HTMLButtonElement, event : Event) -> Boolfn HTMLButtonElement::getElementsByClassName(self : HTMLButtonElement, class_name : String) -> Array[Element]fn HTMLButtonElement::getElementsByTagName(self : HTMLButtonElement, tag_name : String) -> Array[Element]fn HTMLButtonElement::insertAdjacentElement(self : HTMLButtonElement, position : String, element : Element) -> Element?fn HTMLButtonElement::insertAdjacentHTML(self : HTMLButtonElement, position : String, html : String) -> Unitfn HTMLButtonElement::insertAdjacentText(self : HTMLButtonElement, position : String, text : String) -> Unitfn HTMLButtonElement::insertBefore(self : HTMLButtonElement, new_node : Node, ref_node : Node?) -> Nodefn HTMLButtonElement::moveBefore(self : HTMLButtonElement, moved_node : Node, ref_node : Node?) -> Unitfn HTMLButtonElement::off(self : HTMLButtonElement, event_type : String, handler : (Any) -> Unit, capture? : Bool) -> Unitfn HTMLButtonElement::on(self : HTMLButtonElement, event_type : String, handler : (Any) -> Unit, capture? : Bool, once? : Bool, passive? : Bool, signal? : AbortSignal) -> Unitfn HTMLButtonElement::querySelectorAll(self : HTMLButtonElement, selector : String) -> Array[Element]#alias(remove_event_listener)
fn HTMLButtonElement::removeEventListener(self : HTMLButtonElement, event_type : String, handler : (Any) -> Unit, capture? : Bool) -> Unitfn HTMLButtonElement::replaceChild(self : HTMLButtonElement, new_child : Node, old_child : Node) -> Nodefn HTMLButtonElement::toggleAttribute(self : HTMLButtonElement, name : String, force? : Bool) -> Boolpub(all) struct HTMLCanvasElement {
width : Int
height : Int
}impl Show for HTMLCanvasElement#alias(add_event_listener)
fn HTMLCanvasElement::addEventListener(self : HTMLCanvasElement, event_type : String, handler : (Any) -> Unit, capture? : Bool, once? : Bool, passive? : Bool, signal? : AbortSignal) -> Unit#alias(dispatch_event)
fn HTMLCanvasElement::dispatchEvent(self : HTMLCanvasElement, event : Event) -> Boolfn HTMLCanvasElement::getElementsByClassName(self : HTMLCanvasElement, class_name : String) -> Array[Element]fn HTMLCanvasElement::getElementsByTagName(self : HTMLCanvasElement, tag_name : String) -> Array[Element]fn HTMLCanvasElement::insertAdjacentElement(self : HTMLCanvasElement, position : String, element : Element) -> Element?fn HTMLCanvasElement::insertAdjacentHTML(self : HTMLCanvasElement, position : String, html : String) -> Unitfn HTMLCanvasElement::insertAdjacentText(self : HTMLCanvasElement, position : String, text : String) -> Unitfn HTMLCanvasElement::insertBefore(self : HTMLCanvasElement, new_node : Node, ref_node : Node?) -> Nodefn HTMLCanvasElement::moveBefore(self : HTMLCanvasElement, moved_node : Node, ref_node : Node?) -> Unitfn HTMLCanvasElement::off(self : HTMLCanvasElement, event_type : String, handler : (Any) -> Unit, capture? : Bool) -> Unitfn HTMLCanvasElement::on(self : HTMLCanvasElement, event_type : String, handler : (Any) -> Unit, capture? : Bool, once? : Bool, passive? : Bool, signal? : AbortSignal) -> Unitfn HTMLCanvasElement::querySelectorAll(self : HTMLCanvasElement, selector : String) -> Array[Element]#alias(remove_event_listener)
fn HTMLCanvasElement::removeEventListener(self : HTMLCanvasElement, event_type : String, handler : (Any) -> Unit, capture? : Bool) -> Unitfn HTMLCanvasElement::replaceChild(self : HTMLCanvasElement, new_child : Node, old_child : Node) -> Nodeasync fn HTMLCanvasElement::toBlob(self : HTMLCanvasElement, image_type? : String, quality? : Double) -> Blobfn HTMLCanvasElement::toDataURL(self : HTMLCanvasElement, image_type? : String, quality? : Double) -> Stringfn HTMLCanvasElement::toggleAttribute(self : HTMLCanvasElement, name : String, force? : Bool) -> Bool#external
pub type HTMLDivElement#alias(add_event_listener)
fn HTMLDivElement::addEventListener(self : HTMLDivElement, event_type : String, handler : (Any) -> Unit, capture? : Bool, once? : Bool, passive? : Bool, signal? : AbortSignal) -> Unit#alias(dispatch_event)
fn HTMLDivElement::dispatchEvent(self : HTMLDivElement, event : Event) -> Boolfn HTMLDivElement::getElementsByClassName(self : HTMLDivElement, class_name : String) -> Array[Element]fn HTMLDivElement::insertAdjacentElement(self : HTMLDivElement, position : String, element : Element) -> Element?fn HTMLDivElement::insertAdjacentHTML(self : HTMLDivElement, position : String, html : String) -> Unitfn HTMLDivElement::insertAdjacentText(self : HTMLDivElement, position : String, text : String) -> Unitfn HTMLDivElement::off(self : HTMLDivElement, event_type : String, handler : (Any) -> Unit, capture? : Bool) -> Unitfn HTMLDivElement::on(self : HTMLDivElement, event_type : String, handler : (Any) -> Unit, capture? : Bool, once? : Bool, passive? : Bool, signal? : AbortSignal) -> Unit#alias(remove_event_listener)
fn HTMLDivElement::removeEventListener(self : HTMLDivElement, event_type : String, handler : (Any) -> Unit, capture? : Bool) -> Unit#external
pub type HTMLElement#alias(add_event_listener)
fn HTMLElement::addEventListener(self : HTMLElement, event_type : String, handler : (Any) -> Unit, capture? : Bool, once? : Bool, passive? : Bool, signal? : AbortSignal) -> Unitfn HTMLElement::insertAdjacentElement(self : HTMLElement, position : String, element : Element) -> Element?fn HTMLElement::off(self : HTMLElement, event_type : String, handler : (Any) -> Unit, capture? : Bool) -> Unitfn HTMLElement::on(self : HTMLElement, event_type : String, handler : (Any) -> Unit, capture? : Bool, once? : Bool, passive? : Bool, signal? : AbortSignal) -> Unit#alias(remove_event_listener)
fn HTMLElement::removeEventListener(self : HTMLElement, event_type : String, handler : (Any) -> Unit, capture? : Bool) -> Unit#external
pub type HTMLFormElement#alias(add_event_listener)
fn HTMLFormElement::addEventListener(self : HTMLFormElement, event_type : String, handler : (Any) -> Unit, capture? : Bool, once? : Bool, passive? : Bool, signal? : AbortSignal) -> Unit#alias(dispatch_event)
fn HTMLFormElement::dispatchEvent(self : HTMLFormElement, event : Event) -> Boolfn HTMLFormElement::getElementsByClassName(self : HTMLFormElement, class_name : String) -> Array[Element]fn HTMLFormElement::getElementsByTagName(self : HTMLFormElement, tag_name : String) -> Array[Element]fn HTMLFormElement::insertAdjacentElement(self : HTMLFormElement, position : String, element : Element) -> Element?fn HTMLFormElement::insertAdjacentHTML(self : HTMLFormElement, position : String, html : String) -> Unitfn HTMLFormElement::insertAdjacentText(self : HTMLFormElement, position : String, text : String) -> Unitfn HTMLFormElement::off(self : HTMLFormElement, event_type : String, handler : (Any) -> Unit, capture? : Bool) -> Unitfn HTMLFormElement::on(self : HTMLFormElement, event_type : String, handler : (Any) -> Unit, capture? : Bool, once? : Bool, passive? : Bool, signal? : AbortSignal) -> Unit#alias(remove_event_listener)
fn HTMLFormElement::removeEventListener(self : HTMLFormElement, event_type : String, handler : (Any) -> Unit, capture? : Bool) -> Unitfn HTMLFormElement::replaceChild(self : HTMLFormElement, new_child : Node, old_child : Node) -> Node#external
pub type HTMLHeadElement#alias(add_event_listener)
fn HTMLHeadElement::addEventListener(self : HTMLHeadElement, event_type : String, handler : (Any) -> Unit, capture? : Bool, once? : Bool, passive? : Bool, signal? : AbortSignal) -> Unit#alias(dispatch_event)
fn HTMLHeadElement::dispatchEvent(self : HTMLHeadElement, event : Event) -> Boolfn HTMLHeadElement::getElementsByClassName(self : HTMLHeadElement, class_name : String) -> Array[Element]fn HTMLHeadElement::getElementsByTagName(self : HTMLHeadElement, tag_name : String) -> Array[Element]fn HTMLHeadElement::insertAdjacentElement(self : HTMLHeadElement, position : String, element : Element) -> Element?fn HTMLHeadElement::insertAdjacentHTML(self : HTMLHeadElement, position : String, html : String) -> Unitfn HTMLHeadElement::insertAdjacentText(self : HTMLHeadElement, position : String, text : String) -> Unitfn HTMLHeadElement::off(self : HTMLHeadElement, event_type : String, handler : (Any) -> Unit, capture? : Bool) -> Unitfn HTMLHeadElement::on(self : HTMLHeadElement, event_type : String, handler : (Any) -> Unit, capture? : Bool, once? : Bool, passive? : Bool, signal? : AbortSignal) -> Unit#alias(remove_event_listener)
fn HTMLHeadElement::removeEventListener(self : HTMLHeadElement, event_type : String, handler : (Any) -> Unit, capture? : Bool) -> Unitfn HTMLHeadElement::replaceChild(self : HTMLHeadElement, new_child : Node, old_child : Node) -> Node#external
pub type HTMLHeadingElement#alias(add_event_listener)
fn HTMLHeadingElement::addEventListener(self : HTMLHeadingElement, event_type : String, handler : (Any) -> Unit, capture? : Bool, once? : Bool, passive? : Bool, signal? : AbortSignal) -> Unit#alias(dispatch_event)
fn HTMLHeadingElement::dispatchEvent(self : HTMLHeadingElement, event : Event) -> Boolfn HTMLHeadingElement::getElementsByClassName(self : HTMLHeadingElement, class_name : String) -> Array[Element]fn HTMLHeadingElement::getElementsByTagName(self : HTMLHeadingElement, tag_name : String) -> Array[Element]fn HTMLHeadingElement::insertAdjacentElement(self : HTMLHeadingElement, position : String, element : Element) -> Element?fn HTMLHeadingElement::insertAdjacentHTML(self : HTMLHeadingElement, position : String, html : String)