--- layout: layout.njk title: kutty - high power tools for html ---
## [Kutty in a Nutshell](#introduction) Kutty is a library that allows you to access modern browser features directly from HTML, rather than using javascript. To understand kutty, first lets take a look at an anchor tag: ``` html Blog ``` This anchor tag tells a browser: > "When a user clicks on this link, issue an HTTP GET request to '/blog' and load the response content > into the browser window". With that in mind, consider the following bit of HTML: ``` html
Click Me!
``` This tells kutty: > "When a user clicks on this div, issue an HTTP POST request to '/clicked' and use the content from the response > to replace the element with the id `parent-div` in the DOM" Kutty extends and generalizes the core idea of HTML as a hypertext, opening up many more possibilities directly within the language: * Now any element, not just anchors and forms, can issue a HTTP request * Now any event, not just clicks or form submissions, can trigger requests * Now any [HTTP verb](https://en.wikipedia.org/wiki/HTTP_Verbs), not just `GET` and `POST`, can be used * Now any element, not just the entire window, can be the target for update by the request Note that when you are using kutty, on the server side you respond with *HTML*, not *JSON*. This keeps you firmly within the [original web programming model]((https://www.ics.uci.edu/~fielding/pubs/dissertation/rest_arch_style.htm)), using [Hypertext As The Engine Of Application State](https://en.wikipedia.org/wiki/HATEOAS) without even needing to really understand that concept. It's worth mentioning that, if you prefer, you can use the `data-` prefix when using kutty: ``` html Click Me! ``` ## [Installing](#installing) Kutty is a dependency-free javascript library. It can be used via [NPM](https://www.npmjs.com/) as "`kutty.org`" or downloaded or included from [unpkg](https://unpkg.com/browse/kutty.org/) or your other favorite NPM-based CDN: ``` html ``` ## [AJAX](#ajax) The primary feature of kutty is attributes that allow you to issue AJAX requests directly from HTML: * [kt-get](/attributes/kt-get) - Issues a `GET` request to the given URL * [kt-post](/attributes/kt-post) - Issues a `POST` request to the given URL * [kt-put](/attributes/kt-put) - Issues a `PUT` request to the given URL (see [details](#kutty-request-details)) * [kt-patch](/attributes/kt-patch) - Issues a `PATCH` request to the given URL (see [details](#kutty-request-details)) * [kt-delete](/attributes/kt-delete) - Issues a `GET` request to the given URL (see [details](#kutty-request-details)) Each of these attributes takes a URL to issue an AJAX request to. The element will issue a request of the specified type to the given URL when the element is [triggered](#triggers): ```html
Put To Messages
``` This tells the browser: > When a user clicks on this div, PUT to the URL /messages and load the response into the div ### [Triggering Requests](#triggers) By default, AJAX requests are triggered by the "natural" event of an element: * `input`, `textarea` & `select`: the `change` event * `form`: the `submit` event * everything else: the `click` event If you don't want the request to happen on the default event, you can use the [kt-trigger](/attributes/kt-trigger) attribute to specify the event of interest. Here is a `div` that posts to `/mouse_entered` when a mouse enters it: ```html
[Here Mouse, Mouse!]
``` If you want a request to only happen once, you can use the `once` modifier for the trigger: ```html
[Here Mouse, Mouse!]
``` There are few other modifiers you can use for trigger: * `changed` - only issue a request if the value of the element has changed * `delay: