检测更改的输入文本框


289

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

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

1
只需尝试以下几件事:给输入一个type =“ text”并将其设为单例元素。<input id =“ inputDatabaseName” type =“ text” />
szeliga 2011年

清理了一些不必要的代码,仅7年为时已晚。
魔鬼的拥护者

Answers:


521

您可以像这样在jQuery中使用inputJavascript事件

$('#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();"/>

1
似乎找不到此事件的文档,但它的工作方式与我期望的完全相同。知道在哪里可以找到文件页面吗?
Jorge Pedret

3
您可以在HTML5事件列表中找到它:w3schools.com/tags/ref_eventattributes.asp或此处的help.dottoro.com/ljhxklln.php
Ouadie 2013年

7
该解决方案实际上比使用keyup更好。例如,IE使用户可以通过单击不触发键入的X来清除输入字段。
Georg 2013年

7
到目前为止最接近的解决方案,但是当浏览器在文本框上执行自动填充时仍然无法使用。
Saumil 2014年

3
这比第一个答案要好得多。Ctrl,Shift键都算作键盘。最糟糕的是,如果您快速键入,几个输入将仅注册为一个键入事件。
2014年

173

尝试键入而不是更改。

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

这是.keyup()的官方jQuery文档


1
叹了口气,我发誓我尝试了一下(看完这个问题之后:stackoverflow.com/questions/1443292/…)...但是显然不是因为它现在可以工作了!
魔鬼的代言人

27
change仅在元素失去焦点时触发,而在释放键盘上的键时触发keyup。
Declan Cook,

9
如果用户使用ctrl + v粘贴代码或通过使用鼠标将所选文本拖动到#inputDatabaseName上怎么办?您如何检测到的?
Radu Simionescu

5
这样做的主要问题是,如果内容实际更改,它仍然没有考虑在内。只有按下一个按钮
Metropolis

@Metropolis,您已经看到我的答案了吗? stackoverflow.com/a/23266812/3160597
azerafati 2014年

103

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

$("#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对火灾键盘输入,拖动鼠标自动填充复制粘贴的Chrome和Firefox的测试。检查先前的值会使它检测到真实的变化,这意味着在粘贴相同的东西或键入相同的字符等时不会触发。

工作示例: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和不是6搜索f,然后fofoofoob等。


1
这是我尝试的大约6种方法中的第一种。太棒了 谢谢。
恩科德(Enkode),2015年

几乎可以在IE9上使用:如果删除字符,则不会触发该事件。很好的解决方法
Soma 2015年

@Soma,就像其他人所说的那样:“破坏IE并不是一个缺陷,它是一个功能”;)尽管IE不再继续,但是如果您有解决办法,请告诉我们
azerafati 2015年

我知道,但是我必须做这件事情:(事实上,我是:use $("#input").focusout(function () {})。当您在输入之外单击时,将触发该事件。适用于当前版本的Chrome和Firefox,以及IE9
Soma

2
@Soma,如果这是IE工作的唯一方式,则可以只更改此行就用它$("#input").on("input focusout",function(e){
来做

18

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

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


change在这里工作:jsfiddle.net/g6pcp ; keyup在每个键之后发出警报,这不是一个好方法
diEcho

1
@diEcho我认为警报只是使他的代码正常工作的一个示例,而不是他最终打算做的事情。
Scott Harwell

@diEcho斯科特所说的只是为了测试。我就是这样调试的:D
魔鬼的代言人

@Scott,请使用适当的调试器,而不是alert()。这将使调试变得非常容易。
马特·鲍尔

13

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>

3

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

<input type="text"  id="bookdate">

$("#bookdate").datepicker({            
     onSelect: function (selected) {
         //handle change event here
     }
});

0

我认为您也可以使用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;
  }
});

-5

工作:

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

看起来好像是一个不同问题的代码...有关大写值和显示/隐藏内容的内容是什么?
Nico Haase
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.