【问题标题】:jQuery UI Autocomplete On change Event Not Firing Real TimejQuery UI自动完成更改事件未实时触发
【发布时间】:2017-04-15 22:10:39
【问题描述】:

使用 jQuery UI,我试图在 #tag 输入的值更改后立即触发一个事件,但是正如您所看到的,如果用户点击页面而不是值立即触发 log 事件输入的变化

我已经尝试将更改事件与paste 绑定,但我得到了相同的结果。

 $( 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"
    ];
    $( "#tags" ).autocomplete({
      source: availableTags
    });
    
     $("#tags").on('change', function(){
        console.log($(this).val());
    });
  } );
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.0/jquery.min.js"></script>
 <script src="https://code.jquery.com/ui/1.12.1/jquery-ui.js"></script>
 <div class="ui-widget">
  <label for="tags">Tags: </label>
  <input id="tags">
</div>

你能告诉我如何解决这个问题吗?

【问题讨论】:

    标签: javascript jquery jquery-ui jquery-ui-autocomplete


    【解决方案1】:

    据我所知,Javascript 正在按预期执行。 Change 事件仅在 Inputs 值更改后触发。变化并不一定意味着价值发生变化的那一刻。更改意味着输入的值已被提交为不同的值。如果您希望每次执行操作时都发生某些事情,请使用输入事件。

    $( 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"
            ];
            $( "#tags" ).autocomplete({
              source: availableTags
            });
            
             $("#tags").on('input', function(){
                console.log($(this).val());
            });
          } );
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
    <link rel="stylesheet" href="https://ajax.googleapis.com/ajax/libs/jqueryui/1.12.1/themes/smoothness/jquery-ui.css">
    <script src="https://ajax.googleapis.com/ajax/libs/jqueryui/1.12.1/jquery-ui.min.js"></script>
    <label>Input:</label>
    <input type='text' value='' id='tags'/>

    【讨论】:

    • 不错。每天学习新知识 - 在您回答之前从未听说过 input 事件!
    • 我更喜欢input 事件,因为它会在输入实际更改时触发。把它想象成change 事件,但实际上按照您期望的方式工作。 keyup 事件可以在任何键被放开时触发,而无论它是什么都有焦点。
    【解决方案2】:

    我不确定您真正想要什么,但您可以使用keypresskeydown 代替change,只要用户在输入中写入代码就会触发。

    $("#tags").on('keypress', function(){
        console.log($(this).val());
    });
    

    【讨论】:

    • 根据 jQuery 文档:注意:由于任何官方规范都没有涵盖 keypress 事件,因此使用它时遇到的实际行为可能因浏览器、浏览器版本和平台而异。 - 我发现获得真正跨浏览器一致性的唯一方法是使用keyup(甚至不是keydown)。
    猜你喜欢
    • 2011-07-06
    • 1970-01-01
    • 1970-01-01
    • 2011-09-19
    • 1970-01-01
    • 2015-03-17
    • 1970-01-01
    • 2013-05-23
    • 2011-05-13
    相关资源
    最近更新 更多