@doars/doars-fetch v3.1.2
@doars/doars-fetch
Adds a fetch context and directive that handles communication with servers.
Install
From NPM
Install the package from NPM, then import and enable the library in your build.
npm i @doars/doars @doars/doars-fetch// Import library.
import Doars from '@doars/doars'
import DoarsFetch from '@doars/doars-fetch'
// Setup a library instance.
const doars = new Doars()
// Setup the plugin.
const doarsFetch = DoarsFetch(doars /*, options */)
// Enable library.
doars.enable()IIFE build from jsDelivr
Add the IIFE build to the page from for example the jsDelivr CDN and enable the library.
<!-- Import library. -->
<script src="https://cdn.jsdelivr.net/npm/@doars/doars@3/dst/doars.iife.js"></script>
<script src="https://cdn.jsdelivr.net/npm/@doars/doars-fetch@3/dst/doars-fetch.iife.js"></script>
<script type="application/javascript">
document.addEventListener('DOMContentLoaded', () => {
// Setup a library instance.
const doars = new window.Doars()
// Setup the plugin.
const doarsFetch = window.DoarsFetch(doars /*, options */)
// Enable library.
doars.enable()
})
</script>Contexts
The following contexts are added by the plugin.
\$fetch
Call the fetch API.
- Type:
function - Parameters:
{string} urlUrl to fetch from.{object} options = {}Fetch options, see Fetch docs on MDN. An additional option,returnType, has been added to automatically get and convert the returned data. The return type can be one of the following types:arrayBuffer,blob,element,html,formData,json,svg,text,xml, orauto. When the valueautois used it will try to automatically parse the response based on the content type, extension, or accept type header used by the response.
- Returns:
Promise
<!-- On initialization fetch the data from doars.js.org and manually convert it to text and store it as text on the message variable of the state. -->
<div d-state="{ message: 'empty string' }"
d-initialized="
$fetch('https://doars.js.org')
.then((result) => {
result.text().then((text) => {
$inContext(({ $state }) => {
$state.message = text
})
})
})
">
<div d-text="message"></div>
</div>
<!-- On initialization fetch the data from doars.js.org and automatically convert it to text and store it as text on the message variable of the state. -->
<div d-state="{ message: 'empty string' }"
d-initialized="
$fetch('https://doars.js.org', { returnType: 'text' })
.then((text) => {
$inContext(({ $state }) => {
$state.message = text
})
})
">
<div d-text="message"></div>
</div>Directives
The following directives are added by the plugin.
d-fetch
Call the fetch API and place the results in the document. The directive's value should be an expression that resolves to the path needs to be fetched.
The directive can be placed on any element but is especially useful on forms. On form elements it can either listen to form submission events or change events and perform a request at those times. Meaning the directive is excellent at handling form submissions whilst staying on the same page. For instance when the website has a search bar and the results should be shown below it in a pop-up.
If no attribute value is specified and the element is an anchor tag or a form tag then the href and action attribute will be read respectively instead.
When placed on a form the encoding type can be specified using the encoding modifier, otherwise the enctype attribute of the form will be used. The same can be said about the method modifier that will use the method attribute as a fallback on form tags.
The directive supports the redirect, request, and title headers specified in the main library.
d-fetch modifiers
The directive supports the following modifiers.
{number} buffer = nullAmount of times it has to be triggered before the directive is called. If set without a specific value then 5 will be used.{boolean} capture = falseWhether to setcaptureto true on the event listeners.{number} debounce = nullTime in milliseconds the event needs to have been in triggered before the expression is executed. A second event will overwrite the existing debounce and start the timer again. If set without a specific value then 500 will be used.{boolean} decode = falseWhether the returned HTML needs to be decoded. Only relevant if special HTML characters are encoded. For example&has become&or&.{number} delay = nullTime in milliseconds the fetch starts after the event has been triggered. If set without a specific value then 500 will be used.{boolean} document = falseWhether to update the entire document (<head>andbodytags) and not just the element itself.{string} encoding = (method === 'HEAD' || method === 'GET') ? 'parameters' : 'urlencoded'The encoding method for the post data. If the method is eitherheadorgetit will always add the data as url parameters since these request can not have a body, otherwise the default isapplication/x-www-form-urlencoded. Available options arejson,multipart,parameters,urlencoded, andxml.{boolean} history = falseWhether the history of the tab needs to be updated when a new page is loaded. In other words the URL that the user sees in the navigation bar is updated to reflect the page transition. Do note thedocumentmodifier also needs to be enabled on the directive for this to be used.{string} method = 'GET'The request method to use.{boolean} morph = falseWhether to convert the old document structure to the new, or to fully overwrite the existing structure with the new.{string} onThe event to listen to. The default value depends on the element the directive is placed on. For forms this is submit, for inputs this is change, if thepollmodifier is set it will beload. There are also several special event listeners.{boolean} once = falseWWhether theonceoption needs to be enabled when listening to the event.{boolean} passive = falseWhether thepassiveoption needs to be enabled when listening to the event.{number} poll = nullAfter the event is trigger automatically trigger the fetch request again. If set without a specific value then 60000 (one minute) will be used.{string} position = 'inner'Where on the target to apply the fetched content. Available options areappend(inside the target as the first element),prepend(inside the target as the last element),after(outside the target after it),before(outside the target before it),outer(replace the target), andinner(replace the target's contents).{boolean} prevent = falseWhether to callpreventDefaulton the event invoking the route change.{boolean} script = falseIf theallowInlineScriptoption of the main library is not set the effect can still be enabled for this directive.{boolean} self = falseWhether the target of the event invoking the route change must be the directive's element itself and not an underlying element.{boolean} stop = falseWhether to stop the click event from propagating further.{number} throttle = nullTime in milliseconds before the directive can be executed again. If set without a specific value then 500 will be used.
d-fetch special event listeners
The on modifier has several special event listeners that can trigger a fetch request.
intersectThis event will trigger when the element enters the viewport. Useful for lazy loading.loadThis event will trigger when the directive is found and read by the core library.
d-fetch-indicator
Set this directive on the same element as the d-fetch directive to specify another element as the indicator to show when a fetch is invoked, but before the content is fetched. The directive should return an element or the selector of an element inside. If a string is returned the element should exist inside the element with this directive on it.
The simplest way to get an element is to use this directive in combination with the $references context.
The
indicatorname can be changed in the options of the Doars library, not via the plugin options.
d-fetch-select
Set this directive on the same element as the d-fetch directive to select part of the retrieved data as the new content instead of the entire body. The directive should return the selector of an element.
The
selectname can be changed in the options of the Doars library, not via the plugin options.
d-fetch-target
Set this directive on the same element as the d-fetch directive to specify another element as the target to update when a fetch is invoked. The directive should return an element or the selector of an element. If a string is returned the element should exist inside the element with this directive on it.
The simplest way to get an element is to use this directive in combination with the $references context.
The
targetname can be changed in the options of the Doars library, not via the plugin options.
d-fetch examples
<!-- On submit gets from the route. -->
<form d-fetch="'/contact/form/'">
<button type="submit">Submit</button>
</form><!-- On submit gets from the route, but prevents resubmission for a second. -->
<form d-fetch.throttle-1000="'/contact/form/'">
<button type="submit">Submit</button>
</form><!-- On submit gets from the route, and append the contents to the form. -->
<form d-fetch.append="'/contact/form/'">
<button type="submit">Submit</button>
</form><!-- On submit gets from the route, whilst fetching shows the indicator. -->
<form d-fetch="'/contact/form/'" d-fetch-indicator="$references.indicator">
<button type="submit">Submit</button>
<template d-reference="'indicator'">Fetching...</template>
</form><!-- On submit gets from the route, but selects the main element in body to add as the contents of the form. -->
<form d-fetch="'/contact/form/'" d-fetch-select="'body>main'">
<button type="submit">Submit</button>
</form><!-- On submit gets from the route, and sets the contents to the target. -->
<form d-fetch="'/contact/form/'" d-fetch-target="$references.target">
<button type="submit">Submit</button>
<div d-reference="'target'"></div>
</form>Events
d-fetch-started
Dispatched when starting to fetch the contents of URL.
Event
url:URLURL of the contents that are being fetched.
d-fetch-failed
Dispatched when the fetching of the page failed.
Event
response:Response- The response of the failed fetch call.url:URLURL of the contents that was being fetched.
d-fetch-succeeded
Dispatched when the contents has successfully been updated.
Event
url:URLURL of the contents that are being fetched.
API
DoarsFetch
constructorCreate plugin instance.@param {Doars} libraryA doars library instance.@param {object} options = nullSee options.@returns {DoarsFetch}
disableDisables the plugin. Can only be called when the doars is disabled.enableEnables the plugin. Can only be called when the doars is disabled.
DoarsFetch options
{string} fetchContextName = '$fetch'The name of the fetch context.{boolean} fetchDirectiveEvaluate = trueIf set to false the fetch directive's value is read as a string literal instead of an expression to process.{string} fetchDirectiveName = 'submit'The name of the fetch directive.{object} fetchOptions = {}Default fetch options to use, the options object provided when calling fetch will be merged with this default.{string|boolean} intersectionEvent = 'intersect'The name of the intersect special event listener. To disable the event from ever triggering set this option to false.{HTMLElement} intersectionRoot = nullThe element to be used as the viewport for checking the visibility of the elements. It must be an ancestor of the targeted elements. By default it is the browsers viewport.{CSS margin property} intersectionMargin = '0px'Margin around the root.{number|Array<number>} intersectionThreshold = 0Thresholds of visibility the directive should be executed.0results in as soon as a pixel is in view.1results in that the entire element needs to be in view.[0, 0.5, 1]results in three possible calls when it is a pixel in view, 50% in view and entirely in view.{string|boolean} loadedEvent = 'load'The name of the load special event listener. To disable the event from ever triggering set this option to false.
Compatible versions
@doars/doars-fetch version | @doars/doars version |
|---|---|
3.x | 3.x |
2.x | 2.x |
1.x | 1.x |