jQuery - 检测隐藏输入字段的值更改
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了jQuery - 检测隐藏输入字段的值更改相关的知识,希望对你有一定的参考价值。
我有一个隐藏的文本字段,其值通过AJAX响应更新。
<input type="hidden" value="" name="userid" id="useid" />
当这个值改变时,我想发出一个AJAX请求。任何人都可以建议如何检测变化?
我有以下代码,但不知道如何查找值:
$('#userid').change( function() {
alert('Change!');
})
所以这是迟到的,但我发现了一个答案,以防它对遇到这个帖子的人有用。
隐藏元素的值更改不会自动触发.change()事件。因此,无论您在何处设置该值,您还必须告诉jQuery触发它。
function setUserID(myValue) {
$('#userid').val(myValue)
.trigger('change');
}
一旦发生这种情况,
$('#userid').change(function(){
//fire your ajax call
})
应该按预期工作。
由于隐藏输入不会在更改时触发“更改”事件,因此我使用MutationObserver来触发此操作。
(有时隐藏的输入值更改由您无法修改的其他脚本完成)
这在IE10及以下版本中不起作用
MutationObserver = window.MutationObserver || window.WebKitMutationObserver;
var trackChange = function(element) {
var observer = new MutationObserver(function(mutations, observer) {
if(mutations[0].attributeName == "value") {
$(element).trigger("change");
}
});
observer.observe(element, {
attributes: true
});
}
// Just pass an element to the function to start tracking
trackChange( $("input[name=foo]")[0] );
您可以简单地使用以下功能,您也可以更改类型元素。
$("input[type=hidden]").bind("change", function() {
alert($(this).val());
});
隐藏元素的值更改不会自动触发.change()事件。因此,无论您在何处设置该值,您还必须告诉jQuery触发它。
<div id="message"></div>
<input type="hidden" id="testChange" value="0" />
var $message = $('#message');
var $testChange = $('#testChange');
var i = 1;
function updateChange() {
$message.html($message.html() + '<p>Changed to ' + $testChange.val() + '</p>');
}
$testChange.on('change', updateChange);
setInterval(function() {
$testChange.val(++i).trigger('change');;
console.log("value changed" +$testChange.val());
}, 3000);
updateChange();
应该按预期工作。
可以使用Object.defineProperty()
重新定义输入元素的'value'属性,并在其更改期间执行任何操作。
Object.defineProperty()
允许我们为属性定义一个getter和setter,从而控制它。
replaceWithWrapper($("#hid1")[0], "value", function(obj, property, value) {
console.log("new value:", value)
});
function replaceWithWrapper(obj, property, callback) {
Object.defineProperty(obj, property, new function() {
var _value = obj[property];
return {
set: function(value) {
_value = value;
callback(obj, property, value)
},
get: function() {
return _value;
}
}
});
}
$("#hid1").val(4);
https://jsfiddle.net/bvvmhvfk/
$('#userid').change(function(){
//fire your ajax call
});
$('#userid').val(10).change();
每次隐藏的草稿字段更改其值(chrome浏览器)时,此示例都会返回草稿字段值:
var h = document.querySelectorAll('input[type="hidden"][name="draft"]')[0];
//or jquery.....
//var h = $('input[type="hidden"][name="draft"]')[0];
observeDOM(h, 'n', function(draftValue){
console.log('dom changed draftValue:'+draftValue);
});
var observeDOM = (function(){
var MutationObserver = window.MutationObserver ||
window.WebKitMutationObserver;
return function(obj, thistime, callback){
if(typeof obj === 'undefined'){
console.log('obj is undefined');
return;
}
if( MutationObserver ){
// define a new observer
var obs = new MutationObserver(function(mutations, observer){
if( mutations[0].addedNodes.length || mutations[0].removedNodes.length ){
callback('pass other observations back...');
}else if(mutations[0].attributeName == "value" ){
// use callback to pass back value of hidden form field
callback( obj.value );
}
});
// have the observer observe obj for changes in children
// note 'attributes:true' else we can't read the input attribute value
obs.observe( obj, { childList:true, subtree:true, attributes:true });
}
};
})();
虽然这个帖子已经3年了,但这是我的解决方案:
$(function ()
{
keep_fields_uptodate();
});
function keep_fields_uptodate()
{
// Keep all fields up to date!
var $inputDate = $("input[type='date']");
$inputDate.blur(function(event)
{
$("input").trigger("change");
});
}
以上是关于jQuery - 检测隐藏输入字段的值更改的主要内容,如果未能解决你的问题,请参考以下文章
使用 Javascript 或 jquery 更改公式中两个输入字段的值