2015-10-15 62 views
0

我在我的HTML代码中有一个隐藏的输入,我想知道输入值何时发生了变化。当我不知道使用jQuery进行更改时,隐藏字段上的触发器更改事件?

<input type="hidden" id="myInputHidden" /> 

我可以做这样的事情:

$('#myInputHidden').on('change', function() { 
    alert('triggered'); 
}); 

首先,这并不工作,并在很多帖子我看了,我必须手动触发事件。

问题是我不知道什么时候(和哪里)输入值被改变,所以我不能触发该事件。

+0

我没有看到代码的第二部分不起作用,为什么你认为它不? –

回答

2

实施change事件的隐藏字段的唯一方法是通过脏检查,如:

(function() { 
    var myHidden = document.getElementById('myInputHidden'), 
     currentValue = myHidden.value; 

    setTimeout(function myHiddenOnChange() { 
    if (myHidden.value !== currentValue) { 
     currentValue = myHidden.value;  
     myHiddenChanged.call(myHidden); 
    } 

    setTimeout(myHiddenOnChange, 30); 
    }, 30); 

    function myHiddenChanged() { 
    // that's your hidden field's 'change' event 
    } 
})(); 

我不建议这样做,但另一种方法是重写在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); 
})(); 

做的是,只要有人改变了value隐藏字段的属性,它会触发change事件,因此,如果您正在收听该事件,那么您的代码将开始工作。

+0

是的...这是一个选项..但是一个肮脏的选项,我想用作最后一个资源 –

+0

@Phoenix_uy它是唯一的一个:) – Buzinas

+0

@Phoenix_uy EventListeners只适用于用户输入,并且由于隐藏的域永远不会获取用户交互,它永远不会触发任何事件,所以你有两个选择:创建一个方法,例如'setHiddenValue',它将改变隐藏字段的'value'属性并手动触发事件(然后改变你的整个代码使用'setHiddenValue'方法而不是直接改变'value'属性,另一个是通过脏检查,取决于你。 – Buzinas