【问题标题】:jQuery autocomplete - how to prevent auto focus when minLength is zerojQuery自动完成 - 当minLength为零时如何防止自动对焦
【发布时间】:2017-12-08 02:39:52
【问题描述】:

 var availableTags = [
    "ActionScript",
    "AppleScript",
    "Asp",
    "BASIC",
    "C",
    "C++",
    "Clojure",
    "COBOL",
    "ColdFusion",
    "Erlang",
    "Fortran",
    "Groovy",
    "Haskell",
    "Java",
    "JavaScript",
    "Lisp",
    "Perl",
    "PHP",
    "Python",
    "Ruby",
    "Scala",
    "Scheme"];
    
    $("#test").autocomplete({
        minLength: 0,
        source: availableTags,
        autoFocus: true,
        select: function (event, ui) {
            if (ui.item) {
                event.preventDefault();
                $(this).val(ui.item.label);
            }
        },
        open: function (event, ui) {
            var menu = $(this).data("uiAutocomplete").menu;
            var items = $('li', menu.element);

            for (var i = 0; i < items.length; i++) {
                if (items.eq(i).text().startsWith($(this).val())) {
                    menu.focus(null, items.eq(i));
                    break;
                }
            }
        },
        focus: function (event, ui) {
            event.preventDefault();
            if ($(this).val() == "" && !event.keyCode) {
                //debugger;
                $('.ui-menu-item a').removeClass('ui-state-focus');
            }
            else {            
                //$(this).data("uiAutocomplete").menu.element.children().first().focus();
            }
        }
    }).on("focus", function () {
        $(this).autocomplete("search", "");
    });
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="form-group">
    <label for="test" class="col-md-3 col-lg-3 control-label"></label>
    <div class="col-md-9 col-lg-7">
        <input id="test" type="text" class="form-control" />
    </div>
</div>

在页面中切换时,默认情况下会使用下拉菜单中的第一个选项填写带有自动完成功能的输入。如果我设置minLength = 1,问题就解决了。但是,我必须保留minLength = 0,以便在输入焦点时弹出下拉菜单。

一个想法是在第一次弹出下拉菜单时删除焦点类。但问题是当我按下箭头时,第二个选项被聚焦而不是第一个。

我找不到任何解决方案来手动关注第一个选项。请帮忙。

任何其他解决方案都非常受欢迎。提前致谢。

【问题讨论】:

    标签: jquery autocomplete focus autofocus


    【解决方案1】:

    我想这会对你有所帮助。

       
        var availableTags = [
          "ActionScript",
          "AppleScript",
          "Asp",
          "BASIC",
          "C",
          "C++",
          "Clojure",
          "COBOL",
          "ColdFusion",
          "Erlang",
          "Fortran",
          "Groovy",
          "Haskell",
          "Java",
          "JavaScript",
          "Lisp",
          "Perl",
          "PHP",
          "Python",
          "Ruby",
          "Scala",
          "Scheme"
        ];
        $( "#test" ).autocomplete({
          source: availableTags
        });
      
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
     <script src="https://code.jquery.com/ui/1.12.1/jquery-ui.js"></script>
       <link rel="stylesheet" href="//code.jquery.com/ui/1.12.1/themes/base/jquery-ui.css">
      <link rel="stylesheet" href="/resources/demos/style.css">
    
    <div class="form-group">
        <label for="test" class="col-md-3 col-lg-3 control-label"></label>
        <div class="col-md-9 col-lg-7">
            <input id="test" type="text" class="form-control" />
        </div>
    </div>

    【讨论】:

    • 感谢您的重播。当输入字段获得焦点时,下拉菜单需要显示。这就是为什么我包含 minLength = 0 来弹出下拉菜单。但是我不希望自动聚焦下拉菜单中的第一个选项的默认功能。希望这很清楚。
    • 我想我找到了问题所在。当结合 minLength = 0、autofocus = true 和 on focus 功能时,下拉菜单将弹出第一个项目焦点。我需要 minLength 和 on focus 函数才能在第一点弹出下拉菜单。当用户输入某事并且该选项是自动对焦时,我需要自动对焦。但是当用户没有输入任何内容时,我不希望第一个选项被关注。希望我说得通。 $( "#test" ).autocomplete({ source: availableTags, minLength: 0, autoFocus: true }).on("focus", function () { $(this).autocomplete("search"); }); ;
    【解决方案2】:

    您需要在 js 的最后部分将 .autocomplete 更改为 .availableTags。希望对您有所帮助

    $( function() {
    var availableTags = [
        "ActionScript",
        "AppleScript",
        "Asp",
        "BASIC",
        "C",
        "C++",
        "Clojure",
        "COBOL",
        "ColdFusion",
        "Erlang",
        "Fortran",
        "Groovy",
        "Haskell",
        "Java",
        "JavaScript",
        "Lisp",
        "Perl",
        "PHP",
        "Python",
        "Ruby",
        "Scala",
        "Scheme"];
        
        $("#test").autocomplete({
            minLength: 0,
            source: availableTags,
            autoFocus: true,
            select: function (event, ui) {
                if (ui.item) {
                    event.preventDefault();
                    $(this).val(ui.item.label);
                }
            },
            open: function (event, ui) {
                var menu = $(this).data("uiAutocomplete").menu;
                var items = $('li', menu.element);
    
                for (var i = 0; i < items.length; i++) {
                    if (items.eq(i).text().startsWith($(this).val())) {
                        menu.focus(null, items.eq(i));
                        break;
                    }
                }
            },
            focus: function (event, ui) {
                event.preventDefault();
                if ($(this).val() == "" && !event.keyCode) {
                    //debugger;
                    $('.ui-menu-item a').removeClass('ui-state-focus');
                }
                else {            
                    //$(this).data("uiAutocomplete").menu.element.children().first().focus();
                }
            }
        }).on("focus", function () {
            $(this).availableTags("search", "");
        });
        });
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
     <script src="https://code.jquery.com/ui/1.12.1/jquery-ui.js"></script>
       <link rel="stylesheet" href="//code.jquery.com/ui/1.12.1/themes/base/jquery-ui.css">
      <link rel="stylesheet" href="/resources/demos/style.css">
    
    <div class="form-group">
        <label for="test" class="col-md-3 col-lg-3 control-label"></label>
        <div class="col-md-9 col-lg-7">
            <input id="test" type="text" class="form-control" />
        </div>
    </div>

    【讨论】:

      【解决方案3】:

      好的,这就是我要解决的问题。我没有使用自动对焦,而是在打开功能中手动设置焦点。

          $("#test").autocomplete({
              minLength: 0,
              source: availableTags,
              //autoFocus: true,
              select: function (event, ui) {
                  if (ui.item) {
                      event.preventDefault();
                      $(this).val(ui.item.label);
                  }
              },
              open: function (event, ui) {
                  var menu = $(this).data("uiAutocomplete").menu;
                  var items = $('li', menu.element);
      
                  if ($(this).val().length > 0) {
                      for (var i = 0; i < items.length; i++) {
                          if (items.eq(i).text().toUpperCase().includes($(this).val().toUpperCase())) {
                              menu.focus(null, items.eq(i));
                              break;
                          }
                      }
                  }
              },
              focus: function (event, ui) {
                  event.preventDefault();
              }
          }).on("focus", function () {
              $(this).autocomplete("search", "");
          });

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-06-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多