# betterdocs/4.9.5/react-src/public/shortcodes/search.js

BetterDocs – AI Documentation, Knowledge Base, MCP Server, Docs, Wikis, FAQ &amp; Chatbot, version 4.9.5. 239 lines.

- Page: https://pluginprobe.com/plugins/betterdocs/4.9.5/code/react-src/public/shortcodes/search.js
- Raw: https://pluginprobe.com/plugins/betterdocs/4.9.5/raw/react-src/public/shortcodes/search.js
- Modified: 2026-10-12T10:07:14+00:00

Line numbers below start at 1. Link to a line or a range by appending a fragment to the
page URL, for example `https://pluginprobe.com/plugins/betterdocs/4.9.5/code/react-src/public/shortcodes/search.js#L10-L20`.

```javascript
class LiveSearch {
    constructor(){
        var $ = jQuery;

        //live search
        this.request;
        this.searchForm = $(".betterdocs-searchform");
        this.searchField = $(".betterdocs-search-field");
        this.searchCategory = $(".betterdocs-search-category");
        this.popularSearch = $(
            ".betterdocs-popular-search-keyword .popular-keyword"
        );
        this.searchClose = $(".docs-search-close");


        this.liveSearch();
    }

    liveSearch() {
        var $ = jQuery;
        var $this = this;
        // disable from submit on enter
        this.popularSearch.on("click", function (e) {
            e.preventDefault();
            let popularKeyword = $(this).text();
            $(this)
                .parent(".betterdocs-popular-search-keyword")
                .siblings(".betterdocs-searchform")
                .find(".betterdocs-search-field")
                .val(popularKeyword)
                .trigger("propertychange");
        });

        this.searchForm.on("keyup keypress", function (e) {
            let keyCode = e.keyCode || e.which;
            if (keyCode === 13) {
                e.preventDefault();
                return false;
            }
        });

        // ajax load titles on keyup to searchbox
        this.searchField.on("input propertychange paste", function (e) {
            let thisEvent = $(this);
            let inputVal = $(this).val();
            let inputCat = thisEvent
                .parent(".betterdocs-searchform-input-wrap")
                .siblings(".betterdocs-search-category")
                .find(":selected")
                .val();
            let resultWrapper = thisEvent
                .parent()
                .parent(".betterdocs-searchform");
            let kbSlug = thisEvent
                .parent()
                .parent(".betterdocs-searchform")
                .find(".betterdocs-search-kbslug")
                .val();

            //Before the result is fetched, we have to remove the search result wrapper based on letter limit characters
            if (!inputVal.length) {
                var nodeResults = thisEvent
                    .parents(".betterdocs-live-search")
                    .find(".betterdocs-search-result-wrap");
                if (nodeResults.length > 0) {
                    nodeResults.each(function (item) {
                        $(nodeResults[item]).remove();
                    });
                }
            }

            $this.liveSearchAction(
                e,
                thisEvent,
                inputVal,
                inputCat,
                resultWrapper,
                kbSlug
            );
        });

        this.searchCategory.on("change", function (e) {
            let thisEvent = $(this);
            let inputVal = thisEvent
                .siblings(".betterdocs-searchform-input-wrap")
                .children(".betterdocs-search-field")
                .val();
            let inputCat = $(this).find(":selected").val();
            let resultWrapper = thisEvent.parent(".betterdocs-searchform");
            let kbSlug = thisEvent
                .parent(".betterdocs-searchform")
                .find(".betterdocs-search-kbslug")
                .val();
            $this.liveSearchAction(
                e,
                thisEvent,
                inputVal,
                inputCat,
                resultWrapper,
                kbSlug
            );
        });

        this.liveSearchAction = function (
            e,
            thisEvent,
            inputVal,
            inputCat,
            resultWrapper,
            kbSlug
        ) {
            let $ = jQuery;
            let resultList = thisEvent
                .parent(".betterdocs-searchform")
                .find(".betterdocs-search-result-wrap");
            let searchLoader = thisEvent.parent().find(".docs-search-loader");
            let searchClose = thisEvent.parent().find(".docs-search-close");
            let search_letter_limit = betterdocsSearchConfig.search_letter_limit;
            if (
                e.key != "a" &&
                e.keyCode != 17 &&
                e.keyCode != 91 &&
                inputVal.length >= search_letter_limit
            ) {
                $this.delay(function () {
                    $this.ajaxLoad(
                        inputVal,
                        inputCat,
                        kbSlug,
                        resultWrapper,
                        resultList,
                        searchLoader,
                        searchClose,
                        thisEvent
                    );
                }, 400);
            } else if (!inputVal.length) {
                thisEvent
                    .parent()
                    .parent(".betterdocs-live-search")
                    .find(".betterdocs-search-result-wrap")
                    .addClass("hideArrow");
                thisEvent
                    .parent()
                    .parent(".betterdocs-live-search")
                    .find(".docs-search-result")
                    .slideUp(300);
                searchLoader.hide();
                searchClose.hide();
            }
        };

        this.searchClose.on("click", function () {
            $(this).hide();
            $(this).parent()
                .parent()
                .find(".betterdocs-search-result-wrap")
                .addClass("hideArrow");
                $(this).parent()
                .parent()
                .find(".docs-search-result")
                .slideUp(300);
            $(this).siblings( ".betterdocs-search-field" ).val("");
        });

        this.delay = (function (callback, ms) {
            let timer = 0;
            return function (callback, ms) {
                clearTimeout(timer);
                timer = setTimeout(callback, ms);
                return timer;
            };
        })();

        this.ajaxLoad = function (
            inputVal,
            inputCat,
            kbSlug,
            resultWrapper,
            resultList,
            searchLoader,
            searchClose,
            inputEvent
        ) {
            var $ = jQuery;
            let request;
            if (request) {
                request.abort();
            }
            request = $.ajax({
                url: betterdocsSearchConfig.ajax_url,
                type: "post",
                data: {
                    action: "betterdocs_get_search_result",
                    search_input: inputVal,
                    search_cat: inputCat,
                    kb_slug: kbSlug || betterdocsSearchConfigTwo?.kb_based_search || '',
                    is_post_type_archive:betterdocsSearchConfigTwo?.is_post_type_archive,
                },
                beforeSend: function () {
                    searchLoader.show();
                    searchClose.hide();
                    resultList.addClass("hideArrow");
                    $(".betterdocs-live-search .docs-search-result").slideUp(
                        400
                    );
                },
                success: function (response) {
                    resultList.remove();
                    searchLoader.hide();
                    searchClose.show();

                    let search_letter_limit =
                        betterdocsSearchConfig.search_letter_limit;
                    var inputVal2 = inputEvent.val();

                    //After the result is fetched, we have to remove the search result wrapper
                    if (inputVal2.length < search_letter_limit) {
                        var nodeResults = $(".betterdocs-live-search").find(
                            ".betterdocs-search-result-wrap"
                        );
                        if (nodeResults.length > 0) {
                            nodeResults.each(function (item) {
                                $(nodeResults[item]).slideUp(400);
                            });
                        }
                        searchClose.hide();
                        return;
                    }

                    resultWrapper.append(response.data.post_lists);
                },
            });
        };
    }
}

new LiveSearch;

```
