侦听JavaScript更改的输入值,无需轮询

侦听JavaScript更改的输入值,无需轮询,javascript,jquery,Javascript,Jquery,我们正在开发的网站上有很多表单。其中一些表单具有使用JavaScript根据用户所做的其他事情填充特定字段的功能。(例如,邮政编码查找) 对于每个表单,我们希望在修改每个表单字段值时执行一些操作 更改时事件不会由JavaScript更改的值触发 MutationObserver似乎无法侦听值更改 (它只侦听属性更改,而不侦听属性更改)。除非 我错过了什么 我们不想(在某些情况下不能)更改 填充字段以触发更改事件 因此,我们有一个表单,其中可能有一些JavaScript或其他JavaScrip

我们正在开发的网站上有很多表单。其中一些表单具有使用JavaScript根据用户所做的其他事情填充特定字段的功能。(例如,邮政编码查找)

对于每个表单,我们希望在修改每个表单字段值时执行一些操作

  • 更改时事件不会由JavaScript更改的值触发

  • MutationObserver似乎无法侦听值更改 (它只侦听属性更改,而不侦听属性更改)。除非 我错过了什么

  • 我们不想(在某些情况下不能)更改 填充字段以触发更改事件

因此,我们有一个表单,其中可能有一些JavaScript或其他JavaScript填充的字段值,我们需要知道字段值何时发生了变化

目前,我们提出的唯一有效解决方案是使用“”定期检查所有字段(使用setInterval)以查看其值是否已更改。我们想知道是否有人能想出更好的解决方案

(我们使用的是jquery1.11.2)

更新:我们已经找到了这个问题的答案,我已经在下面发布了。然而,我们不知道重新定义对象的默认属性会带来什么后果,因此我们对该解决方案还不是100%满意,并继续寻找更多的想法。

Rory给我们提供的解决方案确实有效

可以重新定义对象的“值”属性,使您能够在设置“值”属性时执行任意操作

Object.defineProperty(document.querySelector(".my-object"), "value", {
  set: function(newValue) {
    console.log("Object's value property has changed");

    // do something
    this.style.borderColor = "#228B22";

    // make sure the value is still passed to the input to be output
    return this.defaultValue = newValue;
  }
});

如果不能够修改设置触发事件的值的代码,也不能够修改MutationObserver,那么除了轮询(这很糟糕)之外,您就没有什么其他可以做的了。我强烈建议您尝试编辑设置触发事件的值的代码。为什么不使用诸如knockout.js之类的库?@nbokmans-在粗略搜索时立即用谷歌搜索可能会奏效,尽管我怀疑它是否可靠跨浏览器。@nbokmans如果OP说他们无法修改现有代码,我不认为这有什么用处。如果可能的话,他们也可以添加
trigger()
调用,而不是添加另一个完整的库