Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/421.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 当我不';我不知道jQuery的变化时刻?_Javascript_Jquery - Fatal编程技术网

Javascript 当我不';我不知道jQuery的变化时刻?

Javascript 当我不';我不知道jQuery的变化时刻?,javascript,jquery,Javascript,Jquery,我的HTML代码中有一个隐藏的输入,我想知道输入值什么时候改变了 <input type="hidden" id="myInputHidden" /> 首先,这不起作用,我在许多帖子中读到,我必须手动触发事件 问题是我不知道输入值何时(何地)更改,因此无法触发该事件。将更改为隐藏字段的唯一方法是通过脏检查,例如: (函数(){ var myHidden=document.getElementById('myInputHidden'), currentValue=myHidden.v

我的HTML代码中有一个隐藏的输入,我想知道输入值什么时候改变了

<input type="hidden" id="myInputHidden" />
首先,这不起作用,我在许多帖子中读到,我必须手动触发事件


问题是我不知道输入值何时(何地)更改,因此无法触发该事件。

更改为隐藏字段的唯一方法是通过脏检查,例如:

(函数(){
var myHidden=document.getElementById('myInputHidden'),
currentValue=myHidden.value;
setTimeout(函数myHiddenOnChange(){
如果(myHidden.value!==currentValue){
currentValue=myHidden.value;
myHiddenChanged.call(myHidden);
}
设置超时(myHiddenOnChange,30);
}, 30);
函数myHiddenChanged(){
//这是隐藏字段的“更改”事件
}
})();

我不建议这样做,但另一种方法是重写
HTMLInputElement.prototype
描述符:

(function() {
  var _htmlInputElementValue = Object.getOwnPropertyDescriptor(HTMLInputElement.prototype, 'value'),
      _htmlInputElementValueSet = _htmlInputElementValue.set,
      _ev = document.createEvent('Event');

  _ev.initEvent('change', true, true);

  _htmlInputElementValue.set = function() {
    _htmlInputElementValueSet.apply(this, [].slice.call(arguments));

    if (this.type === 'hidden') {
      this.dispatchEvent(_ev);
    }
  }

  Object.defineProperty(HTMLInputElement.prototype, 'value', _htmlInputElementValue);
})();

这样做,任何时候有人更改隐藏字段的
属性时,它都会触发
更改
事件,因此,如果您正在收听该事件,您的代码将开始工作。

我不明白第二段代码如何不工作,为什么您认为它不工作?是的。。。那是一个选择。。但我想最后用一个肮脏的选项resource@Phoenix_uy它是唯一一个:)@Phoenix\u uy EventListeners只与用户输入一起工作,而且由于隐藏字段永远不会获得用户交互,因此它永远不会触发任何事件,因此您有两个选择:创建一个方法,例如
setHiddenValue
,这将更改隐藏字段的
属性并手动触发事件(然后将整个代码更改为使用
setHiddenValue
方法,而不是直接更改
value
属性。另一个是通过脏检查,由您决定。@Phoenix_uy我为您更新了另一个解决方案。
(function() {
  var _htmlInputElementValue = Object.getOwnPropertyDescriptor(HTMLInputElement.prototype, 'value'),
      _htmlInputElementValueSet = _htmlInputElementValue.set,
      _ev = document.createEvent('Event');

  _ev.initEvent('change', true, true);

  _htmlInputElementValue.set = function() {
    _htmlInputElementValueSet.apply(this, [].slice.call(arguments));

    if (this.type === 'hidden') {
      this.dispatchEvent(_ev);
    }
  }

  Object.defineProperty(HTMLInputElement.prototype, 'value', _htmlInputElementValue);
})();