idle-state
Version:
Running some tasks while browser idling
212 lines (150 loc) • 4.91 kB
Markdown
# introduce
A library for detecting idle state of browser. None dependency, size of 4.7kb. With powerful APIs. -- inspired by `idle-timeout`.
# what I can do
Running some tasks while browser idling
# install
using npm or yarn
```shell
npm install idle-state -S
```
```shell
yarn add idle-state -S
```
using cdn
```html
<script src="https://xxx.xx.xx/idle-state.min.js"></script>
```
# usage
just pass a callback
```js
import idle from 'idle-state'
const foo = () => {
console.log('do task foo.')
}
// just pass a callback, `foo` will be called while browser idling
idle(foo)
```
pass a task-array
```js
import idle from 'idle-state'
const task1 = () => console.log('do task1.')
const task2 = () => console.log('do task2.')
// tasks-array, `task1` & `task2` will be called while browser idling
idle([task1, task2])
```
config opitons or both callback & config options
```js
import idle from 'idle-state'
const task1 = () => console.log('do task1.')
const task2 = () => console.log('do task2.')
// with config
idle({
tasks: [task1, task2],
})
// both callback & config options
// in this case task1 & task2 will be converted to an tasks-array [task1, task2]
idle(task1, { tasks: [task2] })
```
# document
The `idle` function has two arguments
- `callback` - can be a function or function-array
- `[Function]` - considered a single task
- `[Function-array]` - considered a tasks-array
- `options [Object]` - configuration of how task running
- `target [Element | Element-Array]` - the `target` would be watched, which determines whether the state is idling
- `tasks [Function-array]` - tasks-array
- `timeout [Number]` - the duration after the browser enters the idle state, at which time the task begins to execute
- `interval [Number]` - interval of task runing
- `loop [Boolean]` - should task(s) runs loopy
- `mousemoveDetect [Boolean]` - should detect mousemove event. Mousemove events are frequently triggered in the browser, so put it configurable
- `reqeustDetect` [Boolean] - should detect requests(ajax or fetch) on browser
- `events [EventName-array]` - name of events, which would be concated(merged) with default value (`scroll`, `keydown`, `touchmove`, `touchstart`, `click`)
- `onPause [Function]` - called on tasks pause
- `onResume [Function]` - called on tasks resume
- `onDispose [Function]` - called on tasks dispose
# options default value
```js
const noop = () => {}
const defaultOptions = {
target: document.body,
tasks: [],
timeout: 3000,
interval: 1000,
loop: false,
mousemoveDetect: false,
reqeustDetect: true,
events: ['scroll', 'keydown', 'touchmove', 'touchstart', 'click'],
onPause: noop,
onResume: noop,
onDispose: noop,
}
```
# methods
you can get an instance from `idle()` function
```js
import idle from 'idle-state'
const instance = idle(() => {})
```
`instance`
- `.pause(callback)` - pause tasks running
- `.resume(callback)` - resume paused tasks
- `.dispose(callback)` - dispose the resource & remove events handler
- `.push(task-function)` - push a task in current tasks-array
- `.timeout(time)` - set `options.timeout` the duration after the browser enters the idle state, at which time the task begins to execute (in milliseconds)
- `.interval(time)` - set `options.interval` the tasks running interval (in milliseconds)
- `.loop(boolean)` - set `options.loop` should the tasks runs loopy
- `.isIdle` - get current idle state, return a boolean value
> **the `callback` passed by `methods` ( such as `pause(callback)` ) has a higher priority than `options` ( such as `options.onPause` )**
`.pause(callback)`
```js
instnce.pause()
// with callback
instance.pause(() => console.log('task paused.'))
```
`.resume(callback)`
```js
instance.resume()
// with callback
instance.resume(() => console.log('paused task re-running.'))
```
`.dispose(callback)`
```js
instance.dispose()
// with callback
instance.dispose(() => console.log('tasks stoped.'))
```
`.push(task)`
```js
const task = () => console.log('I am a task.')
// task should be a function
instance.push(task)
```
`.timeout(time)`
```js
instance.timeout(2000)
```
`.interval(time)`
```js
instance.interval(2000)
```
`.loop(boolean)`
```js
instance.loop(true)
```
# get current idle state
```js
import idle from 'idle-state'
const instance = idle(() => {})
// you can get current state by
instance.isIdle // => get a Boolean value
```
it will get `false` while browser trigger event [`scroll`, `keydown`, `touchmove`, `touchstart`, `click`] by default, you can config `options.events`,
which will replace default `options.events`
# demo
```shell
npm run dev
```
# build
```shell
npm run build
```