html 输入自动完成下拉列表

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了html 输入自动完成下拉列表相关的知识,希望对你有一定的参考价值。

<!doctype html>
<html lang="en">
  <head>
    <title>Basic</title>
    <!-- Required meta tags -->
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">

    <!-- Bootstrap CSS -->
    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-beta.2/css/bootstrap.min.css" integrity="sha384-PsH8R72JQ3SOdhVi3uxftmaW6Vc51MKb0q5P2rRUpPvrszuE4W1povHYgTpBfshb" crossorigin="anonymous">
    <style>
      .fk-input-dropdown-container .dropdown-menu {
        width: 100%;
      }

      .fk-dropdown-input-container {
        padding: 0;
        border: 0;
        position: relative;
        cursor: text;
        border-radius: .25rem;
      }

      .fk-dropdown-input-container::after {
        display: none;
      }

      .fk-dropdown-input {
        width: 100%;
        position: static;
      }

      .fk-dropdown-toggle-button {
        position: absolute;
        padding: 0.4rem 0.5rem;
        cursor: pointer;
        right: 0px;
        top: calc(50% - 0.85rem);
      }

      .dropdown .dropdown-menu {
          -webkit-transition: max-height 0.3s, opacity 0.2s 0.1s, visibility 0s 0.3s;
          -moz-transition: max-height 0.3s, opacity 0.2s 0.1s, visibility 0s 0.3s;
          -ms-transition: max-height 0.3s, opacity 0.2s 0.1s, visibility 0s 0.3s;
          -o-transition: max-height 0.3s, opacity 0.2s 0.1s, visibility 0s 0.3s;
          transition: max-height 0.3s, opacity 0.2s 0.1s, visibility 0s 0.3s;

          max-height: 0;
          display: block;
          overflow: auto;
          opacity: 0;
          visibility: hidden;
      }

      .dropdown.show .dropdown-menu,
      .dropdown.fk-bs-show .dropdown-menu {
          -webkit-transition: max-height 0.3s, opacity 0.2s, visibility 0s;
          -moz-transition: max-height 0.3s, opacity 0.2s, visibility 0s;
          -ms-transition: max-height 0.3s, opacity 0.2s, visibility 0s;
          -o-transition: max-height 0.3s, opacity 0.2s, visibility 0s;
          transition: max-height 0.3s, opacity 0.2s, visibility 0s;

          max-height: 113px;
          opacity: 1;
          visibility: visible;
      }

    </style>
  </head>
  <body>
    <div class="form-group">
      <div class="dropdown fk-input-dropdown-container">
        <div class="dropdown-toggle fk-dropdown-input-container"  id="example-dropdown-button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
          <input id="example-dropdown-input" type="text" placeholder="Beispiel" class="fk-dropdown-input form-control" />
          <i class="fa fa-caret-down fk-dropdown-toggle-button" aria-hidden="true"></i>
        </div>
        <div id="example-dropdown-menu" class="dropdown-menu" aria-labelledby="fk-trade-creation-wallet-exchange-button">
          <!-- Drodown Elements here -->
        </div>
      </div>
    </div>
    <!-- Optional JavaScript -->
    <script src="https://use.fontawesome.com/b9a84ad649.js"></script>
    <!-- jQuery first, then Popper.js, then Bootstrap JS -->
    <script src="https://code.jquery.com/jquery-3.2.1.slim.min.js" integrity="sha384-KJ3o2DKtIkvYIK3UENzmM7KCkRr/rE9/Qpg6aAZGJwFDMVNA/GpGFF93hXpG5KkN" crossorigin="anonymous"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.12.3/umd/popper.min.js" integrity="sha384-vFJXuSJphROIrBnz7yo7oB41mKfc8JzQZiCq4NCceLEaO4IHwicKwpJf9c9IpFgh" crossorigin="anonymous"></script>
    <script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-beta.2/js/bootstrap.min.js" integrity="sha384-alpBpkh1PFOepccYVYDB4do5UnbKysX5WZXm3XxPqe5iKTfUKjNkCk9SaVuEZflJ" crossorigin="anonymous"></script>
    <script>
      /*
      exampleData = [
        {
          name: "xy",
          id: 1
        },
        {
          name: "cds",
          id: 2
        }
      ]
      */

      /**
      Models a Dropdown with input, that shows the matching results.
      */
      InputDropdown = function(_data, _dropdown, _input, _onSelectCallback) {
        this.input = _input;
        this.data = _data;
        this.dropdown = _dropdown;
        this.$dropdownContainer = this.dropdown.parent();
        this.$dropdownButton = this.$dropdownContainer.children(".fk-dropdown-input-container");
        this.onSelectCallback = _onSelectCallback;
        this.onMatchFunction = function() {};
        this.onNoMatchFunction = function() {};

        this.init = function() {
          this.initiateDropdownBehaviour();
          this.fillWithData(this.data);
          this.handleInput();

          // Reset the input to prevent the browser from auto-fill
          this.input.val("");
        }

        this.setOnInputMatch = function(onMatch) {
            this.onMatchFunction = onMatch;
        };

        this.setOnNoInputMatch = function(onNoMatch) {
            this.onNoMatchFunction = onNoMatch;
        };

        /**
        Stops the dropdown from being closed if the user clicks on the input fields
        twice. Also makes the input getting focused if the user clicks anywhere inside
        of the dropdown button.
        */
        this.initiateDropdownBehaviour = function() {
          let _obj = this;

          this.$dropdownButton.click(function(e) {
            let $dropdownButton = $(this);
            if(e.target === $dropdownButton[0] || e.target === $dropdownButton.children(".fk-dropdown-input")[0]) {
              let $dropdownContainer = $dropdownButton.parents(".fk-input-dropdown-container");
              let $dropdownMenu = $dropdownButton.parent().children(".dropdown-menu");
              if($dropdownContainer.hasClass('show') && _obj.dropdown.hasClass('show')) {
                $dropdownContainer.toggleClass("show");
                _obj.dropdown.toggleClass('show');
                $dropdownButton.attr("aria-expanded", true)
              }
            }
            _obj.input.focus();
          });
        };

        /**
        Default onSelect function that gets fired when the user selects a dropdown
        element.
        */
        this.onSelect = function(_selectedId, _selectedName) {
          this.input.val(_selectedName);
          this.input.attr("data-selected", _selectedId);
        };

        /**
        Adds the onSelect clickhandler to the dropdown items.
        */
        this.initiateActionOnSelect = function() {
          let obj = this;

          // React to users clicks on dropdown elements
          obj.dropdown.children(".dropdown-item").click(function(event) {
            let _selectedId = parseInt($(this).attr("data-id"));
            let _selectedName = $(this).attr("data-name");
            obj.onSelect(_selectedId, _selectedName);
            obj.onSelectCallback(_selectedId, _selectedName, $(this));
          });
        };

        /**
        Inserts the data into the dropdown by creating dropdown elements.
        */
        this.fillWithData = function(_data) {
          console.log(_data);
          this.dropdown.html("");

          if(_data.length > 0) {
            for (var i = 0; i < _data.length; i++) {
              this.dropdown.append("<a class='dropdown-item' href='#' data-name='"+_data[i].name+"' data-id='" + _data[i].id + "'>"+ _data[i].name +"</li>");
            }

            this.initiateActionOnSelect();
          } else {
            this.dropdown.append("<span class='fk-multiple-selection-dropdown-no-matching-data-notification'>Keine passenden Einträge gefunden.</span>");
          }
        };

        /**
        Loops through the data by comparing it to a regular expression.
        */
        this.reload = function(inputText) {
          var dataThatMatchesInput = [];

          for (var i = 0; i < this.data.length; i++) {
            if(this.data[i].name.match(new RegExp('\\b' + inputText, "gi")) !== null) {
              var single = {
                name: this.data[i].name,
                id: this.data[i].id
              }

              dataThatMatchesInput.push(single);
            }
          }

          return dataThatMatchesInput;
        };

        this.getInput = function() {
          return this.input;
        };

        this.handleInput = function() {
          var value = "";
          var obj = this;

          // Insert the basic data when focusing the dropdown
          this.input.focus(function(e) {
            obj.fillWithData(obj.data);
          });

          this.input.keyup(function(e) {
            value = $(this).val();

            /*
            If the user enters something into the
            input, it's not determineable, whether the
            id is still correct. So the id gets resetted
            if the user presses any key. Only if he
            clicked an li it's 100% sure the input
            is valid. To validate manual input the
            value needs to be compared to the actual data.
            */

            obj.input.attr("data-selected", "");

            var dataThatMatchesInput = obj.reload(value);

            obj.fillWithData(dataThatMatchesInput);

          });

          // After the user unfocuses the input, the value can be processed
          obj.input.on("blur", function() {

            if(obj.input.attr("data-selected") === "") {
              let _input = obj.input.val().toLowerCase();

              if(_input !== "") {
                let _matchingDataElementFound = false;

                for(let i = 0; i < obj.data.length; i++) {
                  if(obj.data[i].name.toLowerCase() == _input) {
                    obj.input.attr("data-selected", ""+obj.data[i].id);
                    obj.input.attr("data-name", obj.data[i].name);
                    obj.onMatchFunction(obj.data[i].id, obj.data[i].name);
                    i = obj.data.length;
                    _matchingDataElementFound = true;
                  }
                }

                // no matching wallet or exchange connection found
                if(!_matchingDataElementFound) {
                  obj.input.attr("data-selected", "unknown");
                  obj.onNoMatchFunction();
                }
              } else {
                obj.input.attr("data-selected", "null");
              }
            }
          });
        };

        /**
        Use this method to insert new data into the dropdown
        */
        this.setData = function(_data) {
          this.data = _data;
          this.fillWithData(this.data);
        }

        /**
        Reset the state of the dropdown.
        */
        this.reset = function() {
          this.input.val("");
          this.input.attr("data-selected", "");
          this.fillWithData(this.data);
        };

        this.getSelectedId = function() {
          return this.input.attr("data-selected");
        };

        this.getSelectedName = function() {
          return this.input.val();
        };

        this.setDisabled = function(_disabled) {
          let _dropdownArrow = this.dropdown.parent().find(".fk-dropdown-toggle-button");
          this.input.prop("disabled", _disabled);

          let _preventArrowFromOpeningFunction = function(e) {
            e.stopPropagation();
          }

          if(_disabled) {
            this.$dropdownButton.unbind("click");
            this.$dropdownButton.click(_preventArrowFromOpeningFunction);
            this.$dropdownButton.addClass("fk-bs-disabled");
          } else {
            this.$dropdownButton.unbind("click");
            this.initiateDropdownBehaviour();
            this.$dropdownButton.removeClass("fk-bs-disabled");
          }
        };

      }

    </script>
    <script>
      let exampleData = [
        {
          name: "xy",
          id: 1
        },
        {
          name: "cds",
          id: 2
        }
      ];
      let exampleDropdown = new InputDropdown(exampleData, $("#example-dropdown-menu"), $("#example-dropdown-input"), function() {});
      exampleDropdown.init();
    </script>
  </body>
</html>

以上是关于html 输入自动完成下拉列表的主要内容,如果未能解决你的问题,请参考以下文章

引导自动完成输入下拉菜单未显示

从自动完成下拉列表中未选择任何选项时如何清除 mat- 自动完成

输入框下拉菜单

带有自动完成 + 静态值的下拉菜单

每个单词下方的jQuery-ui自动完成下拉菜单

如何在 MVC 剑道树列表编辑器中实现剑道自动完成下拉菜单