html <input type ="text"/> onchange事件无效

New*_*der 80 javascript dom-events

我正在尝试做一些实验.我想要发生的是,每次用户在文本框中键入内容时,它都会显示在对话框中.我使用了onchangeevent属性来实现它,但它不起作用.我仍然需要按下提交按钮才能使其正常工作.我读到了关于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>
Run Code Online (Sandbox Code Playgroud)

javascript.js

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

 alert(textInput); 
}
Run Code Online (Sandbox Code Playgroud)

Ign*_*ams 114

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

  • 用户从剪贴板粘贴后无法检测更改 (19认同)
  • 那只是解决了我的问题.我更喜欢`onkeyup`,因为它在`input`('element.value')中得到新值 (14认同)
  • 我还注意到按下退格键后"keypress"没有被提升,至少在使用jquery时.按下并释放退格键后,"keyup"会升高."输入"解决了这个问题,也适用于复制粘贴,我认为这是正确的解决方案(因为用户"99问题 - 语法不是一个"指出如下). (4认同)
  • 既然这是公认的答案,我们可以将`onkeypress`解决方案更改为`oninput` (3认同)
  • 当仅在*文本已更改*时才想调用函数时,'onkeypres','onkeyup'等不是解决方案!在这种情况下,关键事件会产生不必要的流量。(非常奇怪的是,该回复已被选择为解决方案,尤其是票数如此之高!!我不对它投反对票,因为我不喜欢仅对答复投反对票。我更喜欢给出其答复的原因。不好-更有帮助!) (2认同)

ryb*_*111 37

使用.on('input'...从jQuery的1.7和上述监控每变化到输入(糊,KEYUP等).

对于静态和动态输入:

$(document).on('input', '.my-class', function(){
    alert('Input changed');
});
Run Code Online (Sandbox Code Playgroud)

仅适用于静态输入:

$('.my-class').on('input', function(){
    alert('Input changed');
});
Run Code Online (Sandbox Code Playgroud)

JSFiddle与静态/动态示例:https://jsfiddle.net/op0zqrgy/7/

  • 这对我来说非常有效 - 谢谢。其他人请注意 - 不要忘记在 onLoad 或其他“开始”监视中实际执行上述代码。 (2认同)

Dra*_*fly 30

检查击键只是部分解决方案,因为可以使用鼠标点击更改输入字段的内容.如果右键单击文本字段,则可以剪切和粘贴选项,以便在不进行击键的情况下更改值.同样,如果启用了自动填充,则可以左键单击一个字段并获取以前输入的文本的下拉列表,您可以使用鼠标单击从您的选项中进行选择.击键陷印不会检测到这些类型的更改.

可悲的是,至少据我所知,没有"onchange"事件立即报告变化.但是有一个适用于所有情况的解决方案:使用setInterval()设置计时事件.

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

<input type="text" name="city" id="city" />
Run Code Online (Sandbox Code Playgroud)

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

var city = "";
Run Code Online (Sandbox Code Playgroud)

将此添加到页面初始化:

setInterval(lookForCityChange, 100);
Run Code Online (Sandbox Code Playgroud)

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

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

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

如果定时事件每十分之一秒发出一次的想法似乎很笨拙,你可以在输入字段收到焦点时启动定时器并在模糊时终止它(使用clearInterval()).我不认为在没有接收焦点的情况下改变输入字段的值是可能的,因此以这种方式打开和关闭定时器应该是安全的.


小智 23

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


99 *_*one 13

onchange 仅当用户提交对input元素的更改时才会发生,大多数情况下,这是元素失去焦点时.

如果你希望你的函数每次元素值改变时触发你应该使用oninput事件 - 这比键上/下事件更好,因为可以用用户的鼠标改变值,即粘贴,或自动填充等

在此处阅读有关更改事件的更多信息

在此处阅读有关输入事件的更多信息


met*_*rce 11

使用以下事件而不是"onchange"

- onkeyup(event)
- onkeydown(event)
- onkeypress(event)
Run Code Online (Sandbox Code Playgroud)


Ash*_*nko 5

首先,什么"不起作用"?你没看到警报吗?

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

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

function checkInput(obj) {
    alert(obj.value); 
}
Run Code Online (Sandbox Code Playgroud)