npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

stinput

v2.0.2

Published

Simple state-based input for browsers.

Downloads

24

Readme

StInput

State-based input for modern browsers.

Install

NPM

npm install stinput

Bower

bower install stinput

Other

Just fetch stinput.js from this repo and include in your web page.

Supported Browsers

StInput don't require any external libs and should work on all modern browsers, but note that it uses JavaScript classes and therefor requires ECMAScript 2015 or newer to run.

Usage Example

To use StInput you need to create an StInput instance, update it at the end of every frame, and query it.

For example:

// create the input manager
input = new StInput();

// our main loop
function mainLoop() 
{
	// left mouse button is down
	if (input.down('mouse_left')) {
		console.log("Mouse is down.");
	}

	// left mouse button was released this update call
	if (input.released('mouse_left')) {
		console.log("Mouse was released this update call.");
	}
	
	// left mouse button was released this update call
	if (input.pressed('mouse_left')) {
		console.log("Mouse was pressed this update call.");
	}
	
	// keyboard button up arrow was released
	if (input.released('left_arrow')) {
		console.log("Left arrow was released this update call.");
	}
	
	// mouse moved
	if (input.mouseMoving) {
		console.log("Mouse delta:", input.mouseDelta);
	}
	
	// update input
	input.endFrame();
}

// start main loop
setInterval(mainLoop);

When you finish using StInput call input.dispose() to unregister all its event handlers.

Full API

Create / Destroy

Creating New StInput:

// 'element' is the DOM element you want to register events on. 
// if not defined, will use 'window'.
var input = new StInput(element);

Destroying StInput:

input.dispose();

Update

For StInput to work properly, you must update it every frame of your main loop, at the end of your update function. To do so, call endFrame():

input.endFrame();

Mouse Buttons

Checking if mouse button is down:

// returns if different mouse buttons are held down
input.down('mouse_left')
input.down('mouse_right')
input.down('mouse_middle')

// Or:

// returns if different mouse buttons are held down
input.mouseDown(input.MouseButtons.left)
input.mouseDown(input.MouseButtons.right)
input.mouseDown(input.MouseButtons.middle)

Checking if a mouse button was released this update call:

// returns if different mouse buttons were released this update call
input.released('mouse_left')
input.released('mouse_right')
input.released('mouse_middle')

// Or:

// returns if different mouse buttons were released this update call
input.mouseReleased(input.MouseButtons.left)
input.mouseReleased(input.MouseButtons.right)
input.mouseReleased(input.MouseButtons.middle)

Checking if mouse button was pressed this update call:

// returns if different mouse buttons were released this update call
input.pressed('mouse_left')
input.pressed('mouse_right')
input.pressed('mouse_middle')

// Or:

// returns if different mouse buttons were released this update call
input.mousePressed(input.MouseButtons.left)
input.mousePressed(input.MouseButtons.right)
input.mousePressed(input.MouseButtons.middle)

Mouse Position & Movement

Get mouse current position:

// returns Point with x,y representing mouse current position
input.mousePosition	

Checking if mouse is currently moving:

// returns true if mouse is currently moving
input.mouseMoving

Get a point {x,y} representing the mouse position delta since last update call:

// returns Point with x,y representing mouse movement
input.mouseDelta

Mouse Wheel

Get mouse wheel delta in this update call:

// get mouse wheel delta
input.mouseWheel

// get just the mouse wheel change sign:
input.mouseWheelDirection

Keyboard

Checking if keyboard key is down:

// returns if 'a' key is down
input.down('a')

// Or:

// returns if 'a' key is down
input.keyDown(input.KeyboardKeys.a)

Checking if keyboard key was released this update call:

// returns if 'a' key was released this update call
input.released('a')

// Or:

// returns if 'a' key was released this update call
input.keyReleased(input.KeyboardKeys.a)

Checking if keyboard key was pressed this update call:

// returns if 'a' key was released this update call
input.pressed('a')

// Or:

// returns if 'a' key was released this update call
input.keyPressed(input.KeyboardKeys.a)

Check if any keyboard key is currently down:

// returns if any keyboard key is held down
input.anyKeyDown

Check special keys states:

// returns if alt, ctrl, or shift are currently held down
// note: in some browsers pressing 'alt' will make the window lose focus, so its not recommended to use
input.altDown
input.ctrlDown
input.shiftDown

Supported Keys

All supported mouse buttons are:

Stinput.MouseButtonss = {
	left: 0,
	middle: 1,
	right: 2,
}

All supported keyboard keys are:

Stinput.KeyboardKeys = {
	backspace: 8,
	tab: 9,
	enter: 13,
	shift: 16,
	ctrl: 17,
	alt: 18,
	break: 19,
	caps_lock: 20,
	escape: 27,
	page_up: 33,
	page_down: 34,
	end: 35,
	home: 36,
	left_arrow: 37,
	up_arrow: 38,
	right_arrow: 39,
	down_arrow: 40,
	insert: 45,
	delete: 46,
	space: 32,
	n0: 48,
	n1: 49,
	n2: 50,
	n3: 51,
	n4: 52,
	n5: 53,
	n6: 54,
	n7: 55,
	n8: 56,
	n9: 57,
	a: 65,
	b: 66,
	c: 67,
	d: 68,
	e: 69,
	f: 70,
	g: 71,
	h: 72,
	i: 73,
	j: 74,
	k: 75,
	l: 76,
	m: 77,
	n: 78,
	o: 79,
	p: 80,
	q: 81,
	r: 82,
	s: 83,
	t: 84,
	u: 85,
	v: 86,
	w: 87,
	x: 88,
	y: 89,
	z: 90,
	left_window_key: 91,
	right_window_key: 92,
	select_key: 93,
	numpad_0: 96,
	numpad_1: 97,
	numpad_2: 98,
	numpad_3: 99,
	numpad_4: 100,
	numpad_5: 101,
	numpad_6: 102,
	numpad_7: 103,
	numpad_8: 104,
	numpad_9: 105,
	multiply: 106,
	add: 107,
	subtract: 109,
	decimal_point: 110,
	divide: 111,
	f1: 112,
	f2: 113,
	f3: 114,
	f4: 115,
	f5: 116,
	f6: 117,
	f7: 118,
	f8: 119,
	f9: 120,
	f10: 121,
	f11: 122,
	f12: 123,
	numlock: 144,
	scroll_lock: 145,
	semicolon: 186,
	equal_sign: 187,
	comma: 188,
	dash: 189,
	period: 190,
	forward_slash: 191,
	grave_accent: 192,
	open_bracket: 219,
	back_slash: 220,
	close_braket: 221,
	single_quote: 222,
}

Miscs

Some extra properties you can set to StInput instance:

input.preventDefaults

If true, will prevent defaults on all events it register to (defaults to false).

input.enableMouseDeltaWhileMouseWheelDown

If true, will disable the default mouse-wheel-down action to allow getting mouse delta while users hold down the mouse wheel (defaults to true).

input.disableContextMenu

If true, will disable the right-click context menu (defaults to true).

input.resetOnFocusLoss

If true, will reset all internal states when element / window loses focus (defaults to true). This property is described later in details.

Handling Focus Loss

By default, whenever the browser window loses its focus, StInput will reset all its internal state.

This behavior is important to prevent keys from getting "stuck" in down state due to browsers limitations (for example, if you hold down a key, make the window lose focus, and then release the key outside - you won't get the keyup event and the key will remain stuck).

However, if you wish to override this behavior, set resetOnFocusLoss to false:

// will not reset state on focus loss.
input.resetOnFocusLoss = false;

License

StInput is distributed under the permissive MIT license and may be used for any purpose, commercial included.