# hx-boost
The `hx-boost` attribute allows you to "boost" normal anchors and form tags to use AJAX instead. This
has the [nice fallback](https://en.wikipedia.org/wiki/Progressive_enhancement) that, if the user does not
have javascript enabled, the site will continue to work.
## Syntax
```html
<div hx-boost="true">
<a href="/page1">Go To Page 1</a>
</div>
```
For anchor tags, clicking on the anchor will issue a `GET` request to the url specified in the `href` and
will push the url so that a history entry is created. The target is the `<body>` tag, and the `innerHTML`
swap strategy is used by default. All of these can be modified by using the appropriate attributes, except
the `click` trigger.
For forms the request will be converted into a `GET` or `POST`, based on the method in the `method` attribute
and will be triggered by a `submit`. Again, the target will be the `body` of the page, and the `innerHTML`
swap will be used. The url will _not_ be pushed, however, and no history entry will be created. (You can use the
[`hx-push-url`](https://four.htmx.org/reference/attributes/hx-push-url) attribute if you want the url to be pushed.)
Here is an example of some boosted links:
```html
<div hx-boost="true">
<a href="/page1">Go To Page 1</a>
<a href="/page2">Go To Page 2</a>
</div>
```
These links will issue an ajax `GET` request to the respective URLs and replace the body's inner content with it.
Here is an example of a boosted form:
```html
<form hx-boost="true" action="/example" method="post">
<input name="email" type="email" placeholder="Enter email...">
<button>Submit</button>
</form>
```
This form will issue an ajax `POST` to the given URL and replace the body's inner content with it.
## Advanced Syntax
You can configure boost behavior using a config string that sets swap, target, and other options directly
on the `hx-boost` attribute. Use `hx-boost:inherited` to pass that config down to all boosted descendants:
```html
<body hx-boost:inherited='swap:"innerHTML", target:"#main", select:"#content"'>
<div id="main">
<!-- Boosted links inherit the config -->
<a href="/page1">Go To Page 1</a>
<a href="/page2">Go To Page 2</a>
<!-- Override with a different boost config -->
<div hx-boost:inherited='swap:"outerHTML", target:"#result"'>
<a href="/page3">Page 3 (uses div config)</a>
<!-- Disable boost for a specific link -->
<a href="/external" hx-boost="false">External</a>
<!-- Custom boost config on the element itself overrides all -->
<a href="/page4" hx-boost='swap:"beforeend", target:"#list"'>Page 4</a>
</div>
<!-- Non-boosted elements are unaffected -->
<div hx-get="/data" hx-trigger="load">Loading...</div>
</div>
</body>
```
The key advantage is that boost config only applies to boosted elements (links and forms), unlike inherited
`hx-*` attributes which would affect all descendant htmx elements.
### Priority Order
Boost config **overrides** explicit `hx-*` attributes on the element:
1. Boost config (highest priority)
2. Explicit `hx-*` attributes
3. Default values (lowest priority)
This allows you to:
- Set base defaults with `hx-target`, `hx-swap` on elements
- Override them with `hx-boost:inherited` at any level
- Use `hx-boost="true"` or `hx-boost="false"` to enable/disable
Supported modifiers:
- `swap:STYLE` - Swap strategy (innerHTML, outerHTML, etc.)
- `target:SELECTOR` - Target element selector
- `select:SELECTOR` - Content selection from response
## Notes
* Only links that are to the same domain and that are not local anchors will be boosted
* All requests are done via AJAX, so keep that in mind when doing things like redirects
* To find out if the request results from a boosted anchor or form, look for
[`HX-Boosted`](https://four.htmx.org/reference/headers/HX-Boosted) in the request header
* Selectively disable boost on child elements with `hx-boost="false"`
* Disable the replacement of elements via boost, and their children, with
[`hx-preserve="true"`](https://four.htmx.org/reference/attributes/hx-preserve)
Convert links and forms to AJAX
The hx-boost attribute allows you to “boost” normal anchors and form tags to use AJAX instead. This
has the nice fallback that, if the user does not
have javascript enabled, the site will continue to work.
<div hx-boost="true"> <a href="/page1">Go To Page 1</a></div>
For anchor tags, clicking on the anchor will issue a GET request to the url specified in the href and
will push the url so that a history entry is created. The target is the <body> tag, and the innerHTML
swap strategy is used by default. All of these can be modified by using the appropriate attributes, except
the click trigger.
For forms the request will be converted into a GET or POST, based on the method in the method attribute
and will be triggered by a submit. Again, the target will be the body of the page, and the innerHTML
swap will be used. The url will not be pushed, however, and no history entry will be created. (You can use the
hx-push-url attribute if you want the url to be pushed.)
Here is an example of some boosted links:
<div hx-boost="true"> <a href="/page1">Go To Page 1</a> <a href="/page2">Go To Page 2</a></div>
These links will issue an ajax GET request to the respective URLs and replace the body’s inner content with it.
You can configure boost behavior using a config string that sets swap, target, and other options directly
on the hx-boost attribute. Use hx-boost:inherited to pass that config down to all boosted descendants:
<body hx-boost:inherited='swap:"innerHTML", target:"#main", select:"#content"'> <div id="main"> <!-- Boosted links inherit the config --> <a href="/page1">Go To Page 1</a> <a href="/page2">Go To Page 2</a> <!-- Override with a different boost config --> <div hx-boost:inherited='swap:"outerHTML", target:"#result"'> <a href="/page3">Page 3 (uses div config)</a> <!-- Disable boost for a specific link --> <a href="/external" hx-boost="false">External</a> <!-- Custom boost config on the element itself overrides all --> <a href="/page4" hx-boost='swap:"beforeend", target:"#list"'>Page 4</a> </div> <!-- Non-boosted elements are unaffected --> <div hx-get="/data" hx-trigger="load">Loading...</div> </div></body>
The key advantage is that boost config only applies to boosted elements (links and forms), unlike inherited
hx-* attributes which would affect all descendant htmx elements.