【问题标题】:Detect changed input text box检测更改的输入文本框
【发布时间】:2011-09-03 10:15:48
【问题描述】:

我查看了许多其他问题并找到了非常简单的答案,包括下面的代码。我只是想检测何时有人更改了文本框的内容,但由于某种原因它不起作用......我没有收到控制台错误。当我在浏览器中的 change() 函数处设置断点时,它永远不会命中它。

$('#inputDatabaseName').change(function () { 
    alert('test'); 
});
<input id="inputDatabaseName">

【问题讨论】:

  • 只需要尝试几件事:给输入一个 type="text" 并使其成为一个单例元素。

标签: jquery input


【解决方案1】:

文本输入在失去焦点之前不会触发change 事件。在输入之外单击,将显示警报。

如果回调应该在文本输入失去焦点之前触发,请使用.keyup() 事件。

【讨论】:

  • change 在这里工作:jsfiddle.net/g6pcpkeyup 在每个键后发出警报,这不是一个好方法
  • @diEcho 我认为警报只是让他的代码正常工作的一个例子……而不是他最终打算做的事情。
  • @diEcho 斯科特所说的,这只是为了测试目的。这就是我调试的方式:D
  • @Scott 请使用适当的调试器而不是alert()。这将使调试变得容易得多。
【解决方案2】:

尝试使用 keyup 而不是更改。

<script type="text/javascript">
   $(document).ready(function () {
       $('#inputDatabaseName').keyup(function () { alert('test'); });
   });
</script>

这里是the official jQuery documentation for .keyup()

【讨论】:

  • sigh 我发誓我试过了(看了这个问题后:stackoverflow.com/questions/1443292/…)......但显然不是因为它现在有效!
  • change 仅在元素失去焦点时触发,并且在键盘上的键被释放时触发 keyup。
  • 如果用户使用 ctrl+v 粘贴代码或使用鼠标将选定的文本拖动到#inputDatabaseName 上会怎样?你是怎么发现的?
  • 这样做的主要问题是它仍然没有考虑内容是否实际发生变化。只是按下了一个按钮
  • @Metropolis,你看到我的回答了吗?? stackoverflow.com/a/23266812/3160597
【解决方案3】:

您可以像这样在 jQuery 中使用input Javascript event

$('#inputDatabaseName').on('input',function(e){
    alert('Changed!')
});

在纯 JavaScript 中:

document.querySelector("input").addEventListener("change",function () {
  alert("Input Changed");
})

或者像这样:

<input id="inputDatabaseName" onchange="youFunction();"
onkeyup="this.onchange();" onpaste="this.onchange();" oninput="this.onchange();"/>

【讨论】:

  • 似乎找不到此事件的文档,但它的工作方式完全符合我的预期。知道在哪里可以找到文档页面吗?
  • 您可以在 HTML5 事件列表中找到它:w3schools.com/tags/ref_eventattributes.asp 或这里 help.dottoro.com/ljhxklln.php
  • 这个方案其实比使用keyup好很多。例如。 IE 允许用户通过单击不会触发 keyup 的 X 来清除输入字段。
  • 迄今为止最接近的解决方案,但当浏览器对文本框执行自动填充时仍然无法正常工作。
  • 这比第一个答案要好得多。 Ctrl、Shift 键都算作 keyup。最糟糕的是,如果你快速键入,多个输入将仅注册为一个按键事件。
【解决方案4】:

onkeyup, onpaste, onchange, oninput 似乎在浏览器对文本框执行自动填充时失败。要处理这种情况,请在您的文本字段中包含“autocomplete='off'”以防止浏览器自动填充文本框,

例如,

<input id="inputDatabaseName" autocomplete='off' onchange="check();"
 onkeyup="this.onchange();" onpaste="this.onchange();" oninput="this.onchange();" />

<script>
     function check(){
          alert("Input box changed");
          // Things to do when the textbox changes
     }
</script>

【讨论】:

    【解决方案5】:

    我想你也可以使用keydown

    $('#fieldID').on('keydown', function (e) {
      //console.log(e.which);
      if (e.which === 8) {
        //do something when pressing delete
        return true;
      } else {
        //do something else
        return false;
      }
    });
    

    【讨论】:

      【解决方案6】:

      每个答案都缺少一些要点,所以这是我的解决方案:

      $("#input").on("input", function(e) {
        var input = $(this);
        var val = input.val();
      
        if (input.data("lastval") != val) {
          input.data("lastval", val);
      
          //your change action goes here 
          console.log(val);
        }
      
      });
      <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
      <input type="text" id="input">
      <p>Try to drag the letters and copy paste</p>

      Input Event键盘输入、鼠标拖动自动填充复制粘贴上触发铬和火狐。 检查以前的值可以检测到真正的变化,这意味着在粘贴相同的东西或输入相同的字符等时不会触发。

      工作示例:http://jsfiddle.net/g6pcp/473/


      更新:

      如果您希望仅在用户完成输入后运行change function并防止多次触发更改操作,您可以尝试以下操作:

      var timerid;
      $("#input").on("input", function(e) {
        var value = $(this).val();
        if ($(this).data("lastval") != value) {
      
          $(this).data("lastval", value);
          clearTimeout(timerid);
      
          timerid = setTimeout(function() {
            //your change action goes here 
            console.log(value);
          }, 500);
        };
      });
      <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
      <input type="text" id="input">

      如果用户开始输入(例如“foobar”),此代码会阻止您的change action 为用户输入的每个字母运行,并且仅在用户停止输入时运行,这特别适用于您将输入发送到服务器时(例如搜索输入),这样服务器只有一个搜索foobar而不是六个搜索f然后fo然后foofoob等等。

      【讨论】:

      • 这是我尝试了大约 6 次之后的第一个工作。惊人的。谢谢。
      • 几乎可以在 IE9 上运行:如果你删除一个字符,它不会触发事件。非常好的解决方法
      • @Soma,正如其他人所说“破坏 IE 不是缺陷,它是一个功能”;) 虽然 IE 不再继续使用,但如果你有解决方法,请告诉我们
      • 我知道,但我必须为工作而这样做:(事实上,我这样做:使用$("#input").focusout(function () {})。当您在输入之外单击时,该事件被触发。适用于当前Chrome 和 Firefox 以及 IE9 版本
      • @Soma,如果这是 IE 工作的唯一方式,您可以按照我的方式使用它,只需更改此行 $("#input").on("input focusout",function(e){
      【解决方案7】:

      就我而言,我有一个附加到日期选择器的文本框。唯一对我有用的解决方案是在 datepicker 的 onSelect 事件中处理它。

      <input type="text"  id="bookdate">
      
      $("#bookdate").datepicker({            
           onSelect: function (selected) {
               //handle change event here
           }
      });
      

      【讨论】:

      • 使用相同的日期选择器并需要相同的东西,谢谢!但是仍然很奇怪,无法检测到输入更改,因为可以检测到
      【解决方案8】:

      工作:

      $("#ContentPlaceHolder1_txtNombre").keyup(function () {
          var txt = $(this).val();
              $('.column').each(function () {
                  $(this).show();
                  if ($(this).text().toUpperCase().indexOf(txt.toUpperCase()) == -1) {
                      $(this).hide();
                  }
              });
          //}
      });
      

      【讨论】:

      • 这看起来像是一个不同问题的代码......关于大写值和显示/隐藏内容的内容是什么?
      【解决方案9】:

      尝试这样的方法,它总是有效的。

      $(function() {
          $("#my_input").on("change paste keyup", function() {
             alert($(this).val()); 
          });
      });
      

      【讨论】:

        猜你喜欢
        • 2015-02-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-07-22
        • 1970-01-01
        • 1970-01-01
        • 2018-02-07
        相关资源
        最近更新 更多