html <input type =“ text” /> onchange事件不起作用


86

我正在尝试做一些实验。我想发生的是,每当用户在文本框中键入内容时,它将显示在对话框中。我使用onchange事件属性来实现它,但是它不起作用。我仍然需要按“提交”按钮才能使其正常工作。我阅读了有关AJAX的文章,并正在考虑了解这一点。我是否仍需要AJAX使其起作用,或者简单的JavaScript够用吗?请帮忙。

index.php

<script type="text/javascript" src="javascript.js"> </script>

<form action="index.php" method="get">
 Integer 1: <input type="text" id="num1" name="num1" onchange="checkInput('num1');" /> <br />
 Integer 2: <input type="text" id="num2" name="num2" onchange="checkInput('num2');" /> <br />
 <input type="submit" value="Compute" />
</form>

javascript.js

function checkInput(textbox) {
 var textInput = document.getElementById(textbox).value;

 alert(textInput); 
}

4
您可以发送“ this”而不是ID,因此不必致电getElementById
remi bourgarel 2011年

是的...谢谢我做了Ash Burlaczenko告诉我的...
Newbie Coder

使用JQuery时,这里提出了一个不错的解决方案:stackoverflow.com/a/8167009/2065594
西里尔·提卡

Answers:


126

onchange仅在控件模糊时触发。试试吧onkeypress


19
用户从剪贴板粘贴后无法检测更改
Juozas Kontvainis

18
这就解决了我的问题。onkeyup不过,我还是比较喜欢,因为它在input('element.value')中获得了新的价值
secretthjong 2014年

4
我还注意到,至少在使用jquery时,按退格键后不会出现“ keypress”。按下并释放退格键后,“ keyup”确实会升高。“输入”解决了这个问题,并且也适用于复制粘贴,我认为这是正确的解决方案(因为用户“ 99个问题-语法不一”在下面指出)。
Patrick Finnigan

4
如果仅在文本已更改的情况下才想调用函数,“ onkeypres”,“ onkeyup”等不是解决方案!在这种情况下,关键事件会产生不必要的流量。(非常奇怪的是,该回复被选择为解决方案,尤其是投票得这么少!不好-更有帮助!)
Apostolos

对于HTML≥5或jQuery≥1.7,下面还有其他解决方案,也可以处理从剪贴板粘贴的问题。
user202729

41

使用.on('input'...以监视来自jQuery的1.7及以上的每一个变化到输入(粘贴,KEYUP等)。

对于静态和动态输入:

$(document).on('input', '.my-class', function(){
    alert('Input changed');
});

仅对于静态输入:

$('.my-class').on('input', function(){
    alert('Input changed');
});

具有静态/动态示例的JSFiddle:https ://jsfiddle.net/op0zqrgy/7/


这对我来说非常完美-谢谢。其他注意事项-不要忘记在onLoad中实际执行上述代码或对其进行“开始”监视。
罗伯特·彭里奇

来不及发表评论,但是...如果回答用户显示纯JavaScript,为什么建议使用jQuery?
安德烈斯·莫拉莱斯

@AndrésMorales这是许多应用程序都可以直接访问的通用库,很容易将其添加到没有的库中。显然,此答案不适用于不能(或选择不使用)jQuery的应用程序。
rybo111

@ rybo111确实!jQuery是一个常用的库,已被广泛使用,但是它在我的脑海中直接链接到有关“使用JavaScript求两个数字求和”的模因问题,以及有关使用jQuery来完成此问题的最强烈的回答。并非如此,但是许多人无法将JavaScript和jQuery分开。
安德烈斯·莫拉莱斯

@AndrésMorales注意,我的回答包括“粘贴,键入等”。我记得当我回答这个问题时(7年前!),jQuery解决方案很方便。
rybo111

30

检查击键仅仅是部分解决方案,因为可以使用鼠标单击来更改输入字段的内容。如果右键单击文本字段,则将具有剪切和粘贴选项,可用于更改值而无需按键。同样,如果启用了自动完成功能,则可以在字段中单击鼠标左键,然后获得以前输入的文本的下拉菜单,然后单击鼠标即可从选项中进行选择。击键陷阱将不会检测到这两种类型的更改。

不幸的是,至少就我所知,没有“ onchange”事件会立即报告更改。但是,有一种适用于所有情况的解决方案:使用setInterval()设置计时事件。

假设您的输入字段的ID和名称为“ city”:

<input type="text" name="city" id="city" />

有一个名为“ city”的全局变量:

var city = "";

将此添加到您的页面初始化中:

setInterval(lookForCityChange, 100);

然后定义一个lookForCityChange()函数:

function lookForCityChange()
{
    var newCity = document.getElementById("city").value;
    if (newCity != city) {
        city = newCity;
        doSomething(city);     // do whatever you need to do
    }
}

在此示例中,每100毫秒检查一次“ city”的值,您可以根据需要进行调整。如果愿意,可以使用匿名函数代替定义lookForCityChange()。请注意,您的代码甚至浏览器可能会为输入字段提供初始值,因此在用户执行任何操作之前,系统可能会通知您“更改”。根据需要调整代码。

如果计时事件每十分之一秒消失的想法似乎令人费解,则可以在输入字段接收到焦点时启动计时器,并在模糊时终止它(使用clearInterval())。我认为没有输入焦点就无法更改输入字段的值,因此以这种方式打开和关闭计时器应该是安全的。


1
如果无法在没有获得焦点的情况下更改输入字段的值,并且在元素失去焦点时发生模糊,那么为什么不只在onblur中查找更改呢?
帕克曼

您想在输入字段更改时或更改后失去焦点时采取措施吗?如果您想立即采取行动,就等不及了。
蜻蜓2014年

@Pakman在某些情况下,这是一个不错的解决方案。但是,如果您想按类型进行搜索-IMO的一个非常不错的功能(为什么当计算机能够以更快的速度完成工作而又不会感到无聊时,用户为什么要寻找东西?)-或其他任何真正的东西需要在文本更改时发生,为什么不可以呢?
达格

真可悲。
Chuck Batson

1
@ChuckBatson这个答案来自2012年。我注意到您在2016年发表了您的评论。如果您使用的是jQuery,请参阅我的答案,这现在非常容易。
rybo111 '16

25

HTML5定义了一个oninput事件来捕获所有直接更改。这个对我有用。


1
也可以使用type =“ number”微调器控件(onkeypress不能使用)。
鲍勃


11

使用以下事件代替“ onchange”

- onkeyup(event)
- onkeydown(event)
- onkeypress(event)

6

首先,什么是“无效”?您没有看到警报吗?

另外,您的代码可以简化为

<input type="text" id="num1" name="num1" onkeydown="checkInput(this);" /> <br />

function checkInput(obj) {
    alert(obj.value); 
}

2

我遇到了Safari无法在文本输入字段上触发“ onchange”事件的问题。我使用了jQuery 1.7.2“更改”事件,但它也不起作用。我最终使用了ZURB的textchange事件。它与mouseevents一起使用,并且可以在不离开字段的情况下触发:http :
//www.zurb.com/playground/jquery-text-change-custom-event

$('.inputClassToBind').bind('textchange', function (event, previousText) {
    alert($(this).attr('id'));
});

2

IMO的一些重要评论:

  • 在USER操作ENTER或模糊等待之前,输入元素不会发出'change'事件是正确的行为

  • 您要使用的事件是"input"(“ oninput ”)。这很好地证明了两者之间的区别:https : //javascript.info/events-change-input

  • 这两个事件表示两个不同的用户手势/时刻(“输入”事件表示用户正在写或导航选择列表选项,但仍未确认更改。“更改”表示用户确实更改了值(带有回车或模糊操作)我们的)

  • 在这种情况下,倾听像这里建议的许多重要事件是一种不好的做法。(例如人们修改输入中ENTER的默认行为)...

  • jQuery与此无关。这都是HTML标准。

  • 如果您无法理解为什么这是正确的行为,也许会有所帮助,作为实验,请使用文本编辑器或浏览器,而无需鼠标/键盘,而只需键盘。

我的两分钱。




-3

尝试一下onpropertychange。它仅适用于IE。


6
为什么有人会考虑只在其开发人员放弃的过时浏览器中使用的属性?下注。
草皮草皮
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.