当以编程方式更改输入时,on更改解决方案不起作用

I a*_*son 6 javascript forms jquery input onchange

我已经读过为什么onchange不起作用?现在我知道了

仅当用户更改输入值时才触发onchange事件。如果以编程方式更改输入,则不应该触发。

但是我有一个输入字段,当用户通过网站内的Google地图小部件更改位置时,该字段会自动填充。发生这种情况时,我想获取该自动填充的值并填充另一个输入字段。以编程方式更改输入时,如何检测或触发功能?

Kir*_*nov 5

您可以通过覆盖输入value属性的 setter 函数来实现这一点。因此,每次有人以value编程方式设置时,您的覆盖设置器都会被触发:

const input = document.getElementById('input');

const descriptor = Object.getOwnPropertyDescriptor(Object.getPrototypeOf(input), 'value');

Object.defineProperty(input, 'value', {
    set: function(t) {
        console.log('Input value was changed programmatically');
        return descriptor.set.apply(this, arguments);
    },
    get: function() {
      return descriptor.get.apply(this);
    }
});

function changeInput() {
  input.value += '1';
}
Run Code Online (Sandbox Code Playgroud)
<input id="input">
<button onclick="changeInput()">Change</button>
Run Code Online (Sandbox Code Playgroud)

  • 这太棒了,谢谢!不幸的是,有时这是需要的,当您需要在第三方库或框架处理某些 JS 时采取行动,并且您需要在第三方代码更改值时做出反应时,这是唯一的解决方案。谢谢! (2认同)

Ice*_*unk -2

我不确定如果代码更改输入的值是否会触发任何事件。不过,您可以做的是运行一个间隔,不断将输入的值与其先前的值进行比较,并在输入值发生变化时执行某些操作。

const inputBox = document.getElementById('my_input');
let previousValue = inputBox.value;
setInterval(() => {
  if (inputBox.value !== previousValue) {
    // fire change handler, then...
    previousValue = inputBox.value;
  }
}, 500);
Run Code Online (Sandbox Code Playgroud)