【问题标题】:Detecting input change in jQuery?检测jQuery中的输入变化?
【发布时间】:2011-09-21 11:28:12
【问题描述】:

当在 input 上使用 jquery .change 时,该事件只会在输入失去焦点时触发

就我而言,我需要在输入值更改后立即调用服务(检查值是否有效)。我怎么能做到这一点?

【问题讨论】:

  • 什么样的输入?文本框?复选框?收音机?文本区?让我们看看你到目前为止都想出了什么
  • 对不起,它是文本类型的输入。正如我所说,我已经尝试过更改,但这并没有按照我需要的方式触发(对于输入中文本的每次更改)。我也尝试过 keydown 但要让它工作,我必须跟踪输入是否“脏”。
  • 如果他们按下一个键,99% 的时间它都会改变,你总是可以检查事件处理程序中不会出现的键。

标签: javascript jquery html


【解决方案1】:

更新说明和示例

示例:http://jsfiddle.net/pxfunc/5kpeJ/

方法一。input事件

在现代浏览器中使用input 事件。当用户在文本字段中键入、粘贴、撤消,基本上任何时候值从一个值更改为另一个值时,都会触发此事件。

在 jQuery 中这样做

$('#someInput').bind('input', function() { 
    $(this).val() // get the current value of the input field.
});

从 jQuery 1.7 开始,将 bind 替换为 on

$('#someInput').on('input', function() { 
    $(this).val() // get the current value of the input field.
});

方法二。keyup事件

对于较旧的浏览器,使用keyup 事件(一旦键盘上的键被释放,该事件就会触发,该事件可能会产生一种误报,因为当“w”被释放时,输入值会改变,@ 987654335@ 事件触发,但当“shift”键被释放时keyup 事件触发但输入没有改变。)。如果用户从上下文菜单中右键单击并粘贴,此方法也不会触发:

$('#someInput').keyup(function() {
    $(this).val() // get the current value of the input field.
});

方法3.定时器(setIntervalsetTimeout

要绕过keyup 的限制,您可以设置一个计时器来定期检查输入值以确定值的变化。您可以使用setIntervalsetTimeout 进行此计时器检查。请参阅此 SO 问题的标记答案:jQuery textbox change event 或查看小提琴以获取使用 focusblur 事件来启动和停止特定输入字段的计时器的工作示例

【讨论】:

  • 您能详细解释一下这个解决方案吗?如何获得当前值?我如何让它只在对当前值进行更改时运行?
  • 输入事件? jQuery 中没有输入事件(还)...stackoverflow.com/q/11189136/104380
  • 对于方法 2,我通常绑定到 keyup 更改。这样,在输入发生时没有按键(如粘贴)的情况下,它至少会在输入失去焦点时触发事件。
  • @AdiDarachi MutationObserver 将跟踪对 DOM 元素的更改。但是,用户在输入字段中更改数据不会触发 MutationObserver 更改...我设置了一个测试用例,只有对 innerTextvalue 属性的 JS 代码更改(模拟用户输入)会触发 MutationObserver 事件jsfiddle.net/pxfunc/04chgpws/1(有关 MutationObserver 事件记录,请参阅 console.log)。你有不同的测试用例我可以看看吗?
【解决方案2】:

如果你有 HTML5:

  • oninput(仅在实际发生更改时触发,但会立即触发)

否则,您需要检查所有这些可能表明输入元素值发生变化的事件:

  • onchange
  • onkeyup不是keydownkeypress,因为输入的值还没有新的击键)
  • onpaste(支持时)

也许:

  • onmouseup(这个我不确定)

【讨论】:

  • @naomik 来自我的测试,它适用于复选框输入;除了 IE/Edge。可能会出现其他一些例外情况,但对这些输入类型使用 onchange 会更聪明(恕我直言)。
【解决方案3】:

使用 HTML5 和不使用 jQuery,您可以使用 input event:

var input = document.querySelector('input');

input.addEventListener('input', function()
{
    console.log('input changed to: ', input.value);
});

每次输入文本更改时都会触发。

在 IE9+ 和其他浏览器中支持。

jsFiddle here 中试用。

【讨论】:

【解决方案4】:

正如其他人已经建议的那样,您的解决方案是嗅探多个事件
执行此工作的插件通常会监听以下事件:

$input.on('change keydown keypress keyup mousedown click mouseup', handler);

如果您认为合适,您也可以添加focusblur 和其他活动。
我建议不要超过要监听的事件,因为它会在浏览器内存中加载进一步的程序以根据用户的行为执行。

注意:请注意,使用 JavaScript 更改输入元素的值(例如通过 jQuery .val() 方法)不会触发上述任何事件。
(参考:https://api.jquery.com/change/)。

【讨论】:

  • 我还建议添加 focusout 以避免自动完成问题
  • 我明白了。我搜索了一下,好像只有 IE 和 Chrome 部分支持 focusout,对吗?
  • 作为一个温和的补充,要从 jQuery 触发事件,您可以在 .val() 之后调用相应的操作,例如对于输入字段上的更改事件,您可以执行以下操作...@ 987654326@
【解决方案5】:

// 当元素失去焦点时触发.blur

$('#target').blur(function() {
  alert($(this).val());
});

// 手动触发使用:

$('#target').blur();

【讨论】:

  • .change 正如我所说的,仅在输入输出失去焦点并且值更改时才抛出,我需要在输入(文本)更改后立即获得输入改变)。模糊只会在输入失去焦点时触发。
【解决方案6】:

如果您希望在元素内发生更改时触发事件,那么您可以使用keyup 事件。

【讨论】:

  • 好的,但这和keydown差不多吗?我必须自己检查输入是否“脏”?
  • @SnowJim 如果您只想在输入实际更改时执行操作,您必须使用onchange,或者自己跟踪状态。 keydown 不起作用,因为它会在输入状态更改之前触发。
  • @Alnitak exacly 这就是我在这里问这个问题的原因。 onchange 不起作用,是否仅在离开输入时抛出。
  • 房间里的大象当然是移动的。可以肯定的是,那里没有键盘或鼠标事件会有多大用处。 :p
  • @Askdesigners Keyup/down 事件在移动设备上仍应以相同的方式工作。
【解决方案7】:

有像 keyupkeypress 这样的 jQuery 事件,您可以将它们与输入 HTML 元素一起使用。 您还可以使用 blur() 事件。

【讨论】:

  • .change 正如我所说的,仅在输入输出失去焦点并且值更改时才抛出,我需要在输入(文本)更改后立即获得输入改变)。模糊只会在输入失去焦点时触发。
  • 您无法在 keypress 事件期间可靠地检查输入的值,因为按下的键尚未更改该值。
【解决方案8】:

这涵盖了使用 jQuery 1.7 及更高版本对输入的所有更改:

$(".inputElement").on("input", null, null, callbackFunction);

【讨论】:

    猜你喜欢
    • 2012-09-29
    • 1970-01-01
    • 2015-03-30
    • 1970-01-01
    • 2016-10-04
    • 2011-09-25
    • 1970-01-01
    • 2020-02-20
    相关资源
    最近更新 更多