jQuery - 检测隐藏输入字段的值更改

问题描述 投票:234回答:7

我有一个隐藏的文本字段,其值通过AJAX响应更新。

<input type="hidden" value="" name="userid" id="useid" />

当这个值改变时,我想发出一个AJAX请求。任何人都可以建议如何检测变化?

我有以下代码,但不知道如何查找值:

$('#userid').change( function() {  
    alert('Change!'); 
}) 
jquery event-handling field onchange hidden
7个回答
572
投票

所以这是迟到的,但我发现了一个答案,以防它对遇到这个帖子的人有用。

隐藏元素的值更改不会自动触发.change()事件。因此,无论您在何处设置该值,您还必须告诉jQuery触发它。

function setUserID(myValue) {
     $('#userid').val(myValue)
                 .trigger('change');
}

一旦发生这种情况,

$('#userid').change(function(){
      //fire your ajax call  
})

应该按预期工作。


22
投票

由于隐藏输入不会在更改时触发“更改”事件,因此我使用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] );

9
投票

您可以简单地使用以下功能,您也可以更改类型元素。

 $("input[type=hidden]").bind("change", function() {
       alert($(this).val()); 
 });

隐藏元素的值更改不会自动触发.change()事件。因此,无论您在何处设置该值,您还必须告诉jQuery触发它。

HTML

 <div id="message"></div>
<input type="hidden" id="testChange" value="0"  />    

JAVASCRIPT

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();

应该按预期工作。

http://jsfiddle.net/7CM6k/3/


4
投票

可以使用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/


2
投票
$('#userid').change(function(){
  //fire your ajax call  
});

$('#userid').val(10).change();

0
投票

每次隐藏的草稿字段更改其值(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
投票

虽然这个帖子已经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");
    });
}
© www.soinside.com 2019 - 2024. All rights reserved.