Categories: Development

jQuery filter contents on text input

How to filter out page content based on text input value using jQuery. A search input is used to find if the value exists in each div.

CodePen example.

Explanation

When the contents of the text input are changed the filterRows function will be called

$('#animal-search').on('input', filterRows);

Here is the filterRows function with each part explained below

function filterRows() {
    let query = $.trim($('#animal-search').val().toUpperCase());
    setTimeout(function () {
        $('div.group-row').each(function () {
            let animal1 = $(this).closest('.group-row').find('#animal1').val().trim().toUpperCase();
            let animal2 = $(this).closest('.group-row').find('#animal2').val().trim().toUpperCase();
            let animal3 = $(this).closest('.group-row').find('#animal3').val().trim().toUpperCase();

            if (animal1.indexOf(query) !== -1 || animal2.indexOf(query) !== -1 || animal3.indexOf(query) !== -1) {
                $(this).closest('div.group-row').fadeIn();//Show
            } else {
                $(this).closest('div.group-row').fadeOut();//Hide
            }
        });
    }, 500);
}

Breaking down this function piece by piece:

let query = $.trim($('#animal-search').val().toUpperCase());

This gets the text from the input and transforms it into all uppercase. Putting the value into uppercase helps make the filter be compatible as case insensitive.

setTimeout(function () {
    ///
    ///
    ///
}, 500);

setTimeout will delay the inner contents for a specific time as milliseconds.

$('div.group-row').each(function () {
    ///
    ///
    ///
});

Loop through every div on the page with the class group-row.

let animal1 = $(this).closest('.group-row').find('#animal1').val().trim().toUpperCase();
let animal2 = $(this).closest('.group-row').find('#animal2').val().trim().toUpperCase();
let animal3 = $(this).closest('.group-row').find('#animal3').val().trim().toUpperCase();

Get the values of the 3 animals in each group (div), these are made uppercase to complete the filter being case insensitive.

if (animal1.indexOf(query) !== -1 || animal2.indexOf(query) !== -1 || animal3.indexOf(query) !== -1) {
    $(this).closest('div.group-row').fadeIn();//Show
} else {
    $(this).closest('div.group-row').fadeOut();//Hide
}

The final part is using indexOf to check if a match is found for the 3 animals in each group.

indexOf will return -1 if it does not exist. fadeOut and fadeIn are used to hide and re-show the divs.

The HTML:

<div class="container">
    <div class="card">
        <div class="card-header">
            <div class="form-group mb-2">
                <label for="animal-search">Search an animal</label>
                <input type="text" class="form-control" id="animal-search" minlength="1" maxlength="64">
            </div>
        </div>
        <div class="card-body">
            <form>
                <div class="row group-row">
                    <h4 class="text-center">Group A</h4>
                    <div class="col-4 an-animal">
                        <label for="animal1">Animal1</label>
                        <input type="text" class="form-control" id="animal1" minlength="1" maxlength="64"
                               value="Dolphin"
                               disabled>
                    </div>
                    <div class="col-4 an-animal">
                        <label for="animal2">Animal2</label>
                        <input type="text" class="form-control" id="animal2" minlength="1" maxlength="64"
                               value="Wallaby"
                               disabled>
                    </div>
                    <div class="col-4 an-animal">
                        <label for="animal3">Animal3</label>
                        <input type="text" class="form-control" id="animal3" minlength="1" maxlength="64" value="Toucan"
                               disabled>
                    </div>
                </div>
                <div class="row group-row">
                    <h4 class="text-center">Group B</h4>
                    <div class="col-4 an-animal">
                        <label for="animal1">Animal1</label>
                        <input type="text" class="form-control" id="animal1" minlength="1" maxlength="64" value="Cicada"
                               disabled>
                    </div>
                    <div class="col-4 an-animal">
                        <label for="animal2">Animal2</label>
                        <input type="text" class="form-control" id="animal2" minlength="1" maxlength="64"
                               value="Giraffe"
                               disabled>
                    </div>
                    <div class="col-4 an-animal">
                        <label for="animal3">Animal3</label>
                        <input type="text" class="form-control" id="animal3" minlength="1" maxlength="64"
                               value="Seahorse"
                               disabled>
                    </div>
                </div>
                <div class="row group-row">
                    <h4 class="text-center">Group C</h4>
                    <div class="col-4 an-animal">
                        <label for="animal1">Animal1</label>
                        <input type="text" class="form-control" id="animal1" minlength="1" maxlength="64" value="Ferret"
                               disabled>
                    </div>
                    <div class="col-4 an-animal">
                        <label for="animal2">Animal2</label>
                        <input type="text" class="form-control" id="animal2" minlength="1" maxlength="64" value=""
                               disabled>
                    </div>
                    <div class="col-4 an-animal">
                        <label for="animal3">Animal3</label>
                        <input type="text" class="form-control" id="animal3" minlength="1" maxlength="64" value=""
                               disabled>
                    </div>
                </div>
                <div class="row group-row">
                    <h4 class="text-center">Group D</h4>
                    <div class="col-4 an-animal">
                        <label for="animal1">Animal1</label>
                        <input type="text" class="form-control" id="animal1" minlength="1" maxlength="64" value="Alpaca"
                               disabled>
                    </div>
                    <div class="col-4 an-animal">
                        <label for="animal2">Animal2</label>
                        <input type="text" class="form-control" id="animal2" minlength="1" maxlength="64" value=""
                               disabled>
                    </div>
                    <div class="col-4 an-animal">
                        <label for="animal3">Animal3</label>
                        <input type="text" class="form-control" id="animal3" minlength="1" maxlength="64"
                               value="Vulture"
                               disabled>
                    </div>
                </div>
            </form>
        </div>
    </div>
</div>

 

 

Share

Recent Posts

Kennington reservoir drained drone images

A drained and empty Kennington reservoir images from a drone in early July 2024. The…

1 year ago

Merrimu Reservoir drone images

Merrimu Reservoir from drone. Click images to view larger.

1 year ago

FTP getting array of file details such as size using PHP

Using FTP and PHP to get an array of file details such as size and…

2 years ago

Creating Laravel form requests

Creating and using Laravel form requests to create cleaner code, separation and reusability for your…

2 years ago

Improving the default Laravel login and register views

Improving the default Laravel login and register views in such a simple manner but making…

2 years ago

Laravel validation for checking if value exists in the database

Laravel validation for checking if a field value exists in the database. The validation rule…

2 years ago