Blog / AlpineJS

Masking Input Fields With Alpine.js Without Plugins

To create an input mask with Alpine.js, you will need to use the x-bind and x-on directives to bind a function to the input's keydown event, which will allow you to manipulate the input's value as the user types. Here is an example of an input mask for a phone number:

<script src="//unpkg.com/alpinejs" defer></script>

<div x-data="maskInput">
  <input x-bind:value="decimalNumber" x-on:keydown="maskDecimalNumber">
</div>

<script>
  document.addEventListener('alpine:init', () => {
    Alpine.data('maskInput', () => ({
      decimalNumber: '',
      maskDecimalNumber(event) {
  let x = event.target.value.replace(/\D/g, '').match(/(\d{0,3})(\d{0,3})(\d{0,4})/);
      event.target.value = !x[2] ? x[1] : '(' + x[1] + ') ' + x[2] + (x[3] ? '-' + x[3] : '');
      },
    }))
  })
</script>

This will format the input's value as the user types to match the format of a US phone number (e.g. (123) 456-7890).

Example for masking decimal numbers

Here's an example of an input mask for decimal numbers using Alpine.js:

<script src="//unpkg.com/alpinejs" defer></script>

<div x-data="maskInput">
  <input x-bind:value="decimalNumber" x-on:keydown="maskDecimalNumber">
</div>

<script>
  document.addEventListener('alpine:init', () => {
    Alpine.data('maskInput', () => ({
      decimalNumber: '',
      maskDecimalNumber(event) {
        let x = event.target.value.replace(/[^0-9.]/, '');
        event.target.value = x;
      },
    }))
  })
</script>

This will only allow numbers and the decimal point to be entered into the input, and will automatically remove any non-numeric characters that are typed. You can specify the number of decimal digits you want to allow by adding .toFixed(n) where n is the number of decimal digits.

event.target.value = parseFloat(x).toFixed(2);

This will allow 2 decimal digits.