selectize.js

A jQuery-based custom select UI control with autocomplete, tagging, and keyboard-driven multi-select for forms.

Library
npm
v0.15.2
13,019stars
Apache License 2.0

Repository Health

Pre-computed score based on development activity, maintenance, community, maturity, and trend momentum.How we score it →
54/100Fair
Development Activity8
Maintenance20
Community88
Maturity60
Momentum40

Technical Analysis

AI-assessed by reading the actual repository — architecture, code quality, innovation, and documentation.How we score it →
68/100Good
Architecture72
Code Quality68
Innovation58
Learning Curve75

Selectize.js turns a plain <select> or <input> into a searchable, taggable control that feels native to keyboard and touch users alike. It pairs a jQuery plugin surface with an internal search engine (Sifter) that scores and ranks options as the user types, so a dropdown with thousands of entries still feels instant.

The library has been a fixture of form-heavy jQuery applications since 2013 — tag inputs, multi-selects, contact pickers, and country/currency selectors are its classic use cases. It ships as a single dependency-bundled file (with Sifter and Microplugin inlined) plus a matching Bootstrap 2/3/4/5 theme set, so teams can drop it into an existing Bootstrap-based UI without fighting default styles.

What keeps it relevant a decade later is its plugin system: remove buttons, drag-and-drop reordering, clear buttons, optgroup columns, tag limits, and auto-positioning dropdowns are all opt-in plugins rather than baked-in behavior, keeping the core small while letting teams compose exactly the widget they need.

What You Get

  • A drop-in $(...).selectize(options) call that upgrades any select/input element without markup changes
  • Fuzzy, ranked option search powered by the bundled Sifter engine, including diacritic-aware matching
  • Async remote data loading for option sets too large to render up front
  • A tagging/multi-item mode with arrow-key navigation between selected items and multi-item delete
  • An opt-in plugin system (remove_button, clear_button, drag_drop, optgroup_columns, tag_limit, auto_position, and more) so the core stays lean
  • Prebuilt themes for Bootstrap 2, 3, 4, and 5 in both Sass and Less, alongside a default theme
  • TypeScript type definitions (via DefinitelyTyped) for typed consumption in TS projects

Common Use Cases

  • Tag input fields for blog posts, tickets, or content management systems
  • Country, currency, or timezone selectors with fast type-ahead filtering
  • Contact/user picker fields that populate from a remote search endpoint
  • Multi-select filters in admin dashboards and data tables
  • Replacing native multi-selects in Bootstrap-themed forms without a full UI framework rewrite

Under The Hood

Architecture The core Selectize constructor (src/selectize.js, ~2,500 lines) wraps a target $input element, builds a settings object merged with Selectize.defaults (src/defaults.js), and constructs a DOM control (wrapper, input, dropdown, dropdown content) directly via jQuery rather than a virtual-DOM diff — state changes trigger direct DOM mutation methods like refreshOptions/refreshItems. Two mixins, MicroEvent and MicroPlugin (both in src/contrib/), are applied onto the constructor to grant event pub/sub and a plugin-loading lifecycle (initializePlugins) respectively, so plugins in src/plugins/*/plugin.js hook into the instance without touching the core file. Option search and ranking is delegated entirely to Sifter (src/contrib/sifter.js), a separate scoring/tokenizing engine instantiated per-control, which cleanly separates the DOM/interaction layer from the search algorithm. Changing the core constructor’s settings-merge or plugin-init order would ripple through every plugin, since they all assume a fully-initialized self.settings/self.sifter at attach time.

Tech Stack The published artifact is a jQuery plugin (peer dependency on jquery ^1.7–^3, optional jquery-ui for the drag_drop plugin) built with Gulp (gulpfile.js) into dist/js and dist/{css,less,scss} bundles per Bootstrap version. Styling sources are authored in both Sass and Less in parallel (src/scss, src/less) to support teams on either preprocessor. There’s no bundler-driven build for the JS itself — Gulp concatenates and uglifies src/*.js and the vendored contrib/ files (Sifter, Microplugin, Microevent, a nanoid fork for ID generation) into the dist bundle. TypeScript consumers get hand-maintained .d.ts definitions checked into the repo root rather than generated from source.

Code Quality Tests run under Karma against real browsers (karma.conf.js targets ChromeHeadless by default, with Firefox/Safari selectable via BROWSERS env var) using Mocha/Chai, with a substantial suite in test/ covering setup, DOM events, API behavior, XSS handling, and the vendored Sifter/Microplugin logic directly — test/setup.js, test/api.js, test/events_dom.js, and a dedicated test/xss.js file for output-escaping regressions. Coverage reporting is wired via karma-coverage. Source uses plain ES5-style function/prototype patterns (no classes, no TypeScript in the implementation itself) with JSDoc comments on most public methods; a .editorconfig and jshint linting keep style consistent, and a GitHub Actions CodeQL workflow scans for security issues on every push.

What Makes It Unique Unlike React/Vue-era combobox libraries, Selectize bundles its own purpose-built fuzzy-search engine (Sifter) rather than leaning on a generic filter, giving it fast ranked search over large option sets without a virtual-DOM layer. Its plugin architecture predates the current wave of headless UI primitives by years, and its Bootstrap 2/3/4/5 theme parity remains a rare feature for a library this old — most jQuery-era widgets abandoned older Bootstrap versions long ago.

Join founders buildingwith open source

Opinionated takes, migration guides, cost-saving tips, and insights from the open source ecosystem.

Subscribe on Substack
Join 750+ subscribers

Search