jQuery - छिपे इनपुट क्षेत्र पर मूल्य परिवर्तन का पता लगाएं


270

मेरे पास एक छिपा हुआ पाठ क्षेत्र है जिसका मूल्य AJAX प्रतिक्रिया के माध्यम से अद्यतन किया जाता है।

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

जब यह मूल्य बदल जाता है, तो मैं एक AJAX अनुरोध को आग देना चाहूंगा। किसी को भी कैसे परिवर्तन का पता लगाने के लिए सलाह दे सकते हैं?

मेरे पास निम्नलिखित कोड है, लेकिन पता नहीं है कि मूल्य कैसे देखें:

$('#userid').change( function() {  
    alert('Change!'); 
}) 

2
अगर यह एक अजाक्स प्रतिक्रिया के माध्यम से अद्यतन हो जाता है, तो आप प्रतिक्रिया के सफलता समारोह में सिर्फ नया अजाक्स अनुरोध क्यों नहीं करते हैं?
बोनी

2
$ ('# यूजरिड')। वैल () आपको वह मूल्य देगा जो आप पूछ रहे हैं
बोनी

अद्यतन: एक छिपे हुए क्षेत्र का मान अद्यतन होने पर एक परिवर्तन घटना शुरू हो जाती है।
स्टीवन

जवाबों:


622

तो इस तरह से देर हो गई है, लेकिन मैंने एक उत्तर की खोज की है, अगर यह किसी के लिए उपयोगी हो जो इस धागे के पार आता है।

छिपे हुए तत्वों के मूल्य में परिवर्तन स्वचालित रूप से .change () घटना नहीं है। तो, जहाँ भी यह है कि आप उस मूल्य को निर्धारित कर रहे हैं, आपको इसे ट्रिगर करने के लिए jQuery भी बताना होगा।

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

एक बार ऐसा ही है,

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

उम्मीद के मुताबिक काम करना चाहिए।


5
है .trigger()तो बस बुला से अधिक उपयोग करने के लिए आम तौर पर बेहतर change()?
हन्ना

1
यह काम करता है, लेकिन ऐसा लगता है कि यह परिवर्तन की घटना को दो बार ट्रिगर करता है! क्या ऐसा है जैसे अगर मैंने यह कोड डाला है, तो यह दो बार इसे रोक देता है, अगर मैं कोड हटाता हूं, तो कोई भी ट्रिगर नहीं होता है w / e !!
वेनेज़ुएला से Janx

1
यह सुनिश्चित करने के लिए कि changeघटना के समान ही आपको कोड को setUserID()यह जांचने के लिए जोड़ना चाहिए कि क्या मूल्य वास्तव में परिवर्तन है या नहीं। if ($('#userid').val() != myVaule) { // set val() and trigger change }
nnattawat

1
यह विशेष रूप से उपयोगी है यदि आप एक "परिवर्तन" घटना है कि के रूप में जावास्क्रिप्ट के माध्यम से बदला जा रहा है, अन्यथा जावास्क्रिप्ट द्वारा किए गए परिवर्तनों .change (हैंडलर) या .on ( "परिवर्तन", हैंडलर) द्वारा पकड़ा नहीं किया जा सकता पकड़ने की कोशिश कर रहे हैं कर रहे हैं
JJK

7
इसलिए यदि मुझे उस फ़ंक्शन पर नियंत्रण नहीं है जो छिपे हुए फ़ील्ड के मूल्य को बदलता है (अर्थात ट्रिगर को आग नहीं दे सकता है), तो यह समाधान काम नहीं करेगा, है ना?
ओसामा याकूब

31

चूंकि छिपा इनपुट परिवर्तन पर "परिवर्तन" घटना को ट्रिगर नहीं करता है, इसलिए मैंने इसके बजाय इसे ट्रिगर करने के लिए 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] );

AFAIK म्यूटेशनबॉर्स्वर भी एक पाठ क्षेत्र के अंदर एक परिवर्तन पर निकाल नहीं दिया जाता है (कोई फर्क नहीं पड़ता कि क्या छिपा है या नहीं)
ओले अल्बर्स

3
बहुत अच्छा काम करता है! @ ओलेर्स - ओपी ने पूछाinput[type=hidden]
शाय

1
मैंने इसे एक फ़ंक्शन के साथ संयोजन में उपयोग किया है जो कि छिपे हुए इनपुट फ़ील्ड मानों के संग्रह को पुनः प्राप्त करने के लिए jquery के मानचित्र कमांड का उपयोग कर रहा था। बहुत बहुत धन्यवाद @ लल्लूलाल!
एडमजोन

2
सरल और समझने में आसान। यह समाधान, जैसा कि "आपको मूल्य बदलने पर घटना को ट्रिगर करना होगा" समाधान के विपरीत, प्रोग्रामर पर उस बिंदु पर कोड तक पहुंच रखने वाले प्रोग्रामर पर भरोसा नहीं करता है जहां मूल्य बदल जाता है, जब तक आप डॉन करते हैं तब तक यह अधिक उपयोगी होता है। IE11 से पुराने संस्करण का समर्थन नहीं करना चाहिए। वो मेरे लिए बहुत अच्छा था। धन्यवाद
जो सलज़ार

महान समाधान! धन्यवाद! किसी कारण से trigger('change')मेरे लिए काम नहीं किया है, इसलिए मैंने एक CustomEvent बनाया है, इसे पंजीकृत किया है और फिरelement.dispatchEvent(myCustomEvent)
tbutcaru

8

आप बस नीचे दिए गए फ़ंक्शन का उपयोग कर सकते हैं, आप प्रकार तत्व भी बदल सकते हैं।

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

छिपे हुए तत्वों के मूल्य में परिवर्तन स्वचालित रूप से .change () घटना नहीं है। तो, जहाँ भी यह है कि आप उस मूल्य को निर्धारित कर रहे हैं, आपको इसे ट्रिगर करने के लिए jQuery भी बताना होगा।

एचटीएमएल

 <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/


1
मेरे लिए काम नहीं कर रहा ... वैसे भी, एक छिपे हुए क्षेत्र में मूल्य पेस्ट करना कैसे संभव हो सकता है? : /
साइमन डुग्रे

हे धन्यवाद, पेस्ट नहीं होना चाहिए, लेकिन परिवर्तन छिपा क्षेत्र परिवर्तन घटना का पता लगा सकता है
तरुण गुप्ता

@ क्राइस्रिकसन फिडेल के लिए धन्यवाद, मैंने कोड को अपडेट किया है ताकि यह स्पष्ट रूप से परिवर्तन का पता लगा सके, कृपया अद्यतन फिडेल jsfiddle.net/7CM6k/3
तरुण गुप्ता

1
@TarunGupta हाँ यह ट्रिगर पर काम कर रहा है, लेकिन मूल्य नहीं बदल रहा है। जब कोई छिपाया गया मान बदल जाता है, तो ब्राउज़र परिवर्तन घटना को आग नहीं देते, आपको इसे मैन्युअल रूप से करना होगा।
क्रि इरिकसन

सभी छिपे हुए क्षेत्रों के लिए बाध्यकारी के बारे में इस उत्तर का पहला भाग बहुत मददगार था। धन्यवाद!
चाड


4

Object.defineProperty()इनपुट तत्व की 'मूल्य' संपत्ति को फिर से परिभाषित करने और इसके बदलने के दौरान कुछ भी करने के लिए उपयोग करना संभव है ।

Object.defineProperty() हमें एक संपत्ति के लिए एक गेटटर और सेटर को परिभाषित करने की अनुमति देता है, इस प्रकार इसे नियंत्रित करता है।

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/


1
मुझे यह दृष्टिकोण पसंद है, खासकर क्योंकि हर किसी का जवाब "परिवर्तन को स्वयं ट्रिगर करें" ... जो हमेशा संभव नहीं है।
शैलियाँ

1
यह मेरे लिए लगभग सब कुछ काम कर रहा है, लेकिन छिपे हुए क्षेत्र में अंतिम मूल्य वास्तव में नहीं बदला जा रहा है, यदि आप jsfield की जांच करते हैं कि छिपे हुए फ़ील्ड का मान '123' (क्रोम का उपयोग करके) से नहीं बदलता है
मेटागुरु

बहुत करीब है, लेकिन जैसा कि दूसरों ने उल्लेख किया है कि यह क्षेत्र के लिए मूल उत्परिवर्ती / सेटर के संदर्भ को बनाए नहीं रखता है, इसलिए अद्यतन स्वयं छिपे हुए इनपुट को प्रभावित करने में विफल होते हैं। मैं एक नया समाधान पोस्ट कर रहा हूं जिसमें इस दृष्टिकोण के टुकड़े शामिल हैं और एक से stackoverflow.com/a/38802602/4342230
17:20 पर गयपैडडॉक

0

यह उदाहरण हर बार छिपे हुए ड्राफ्ट फ़ील्ड के मूल्य (क्रोम ब्राउज़र) को बदलने पर ड्राफ्ट फ़ील्ड मान लौटाता है:

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

       }
  };
})();

0

विकटार के उत्तर का निर्माण , यहां एक कार्यान्वयन है जिसे आप किसी दिए गए छिपे हुए इनपुट तत्व पर एक बार कॉल कर सकते हैं ताकि यह सुनिश्चित हो सके कि बाद के परिवर्तन की घटना को निकाल दिया जाए जब भी इनपुट तत्व का मूल्य बदल जाए:

/**
 * Modifies the provided hidden input so value changes to trigger events.
 *
 * After this method is called, any changes to the 'value' property of the
 * specified input will trigger a 'change' event, just like would happen
 * if the input was a text field.
 *
 * As explained in the following SO post, hidden inputs don't normally
 * trigger on-change events because the 'blur' event is responsible for
 * triggering a change event, and hidden inputs aren't focusable by virtue
 * of being hidden elements:
 * https://stackoverflow.com/a/17695525/4342230
 *
 * @param {HTMLInputElement} inputElement
 *   The DOM element for the hidden input element.
 */
function setupHiddenInputChangeListener(inputElement) {
  const propertyName = 'value';

  const {get: originalGetter, set: originalSetter} =
    findPropertyDescriptor(inputElement, propertyName);

  // We wrap this in a function factory to bind the getter and setter values
  // so later callbacks refer to the correct object, in case we use this
  // method on more than one hidden input element.
  const newPropertyDescriptor = ((_originalGetter, _originalSetter) => {
    return {
      set: function(value) {
        const currentValue = originalGetter.call(inputElement);

        // Delegate the call to the original property setter
        _originalSetter.call(inputElement, value);

        // Only fire change if the value actually changed.
        if (currentValue !== value) {
          inputElement.dispatchEvent(new Event('change'));
        }
      },

      get: function() {
        // Delegate the call to the original property getter
        return _originalGetter.call(inputElement);
      }
    }
  })(originalGetter, originalSetter);

  Object.defineProperty(inputElement, propertyName, newPropertyDescriptor);
};

/**
 * Search the inheritance tree of an object for a property descriptor.
 *
 * The property descriptor defined nearest in the inheritance hierarchy to
 * the class of the given object is returned first.
 *
 * Credit for this approach:
 * https://stackoverflow.com/a/38802602/4342230
 *
 * @param {Object} object
 * @param {String} propertyName
 *   The name of the property for which a descriptor is desired.
 *
 * @returns {PropertyDescriptor, null}
 */
function findPropertyDescriptor(object, propertyName) {
  if (object === null) {
    return null;
  }

  if (object.hasOwnProperty(propertyName)) {
    return Object.getOwnPropertyDescriptor(object, propertyName);
  }
  else {
    const parentClass = Object.getPrototypeOf(object);

    return findPropertyDescriptor(parentClass, propertyName);
  }
}

इस तरह तैयार दस्तावेज़ पर कॉल करें:

$(document).ready(function() {
  setupHiddenInputChangeListener($('myinput')[0]);
});

-4

हालाँकि यह धागा 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");
    });
}

3
धब्बा ईवेंट केवल तभी ट्रिगर किया जाता है जब इनपुट फ़ोकस खो देता है। एक छिपे हुए इनपुट के लिए एक वैध प्रतिक्रिया नहीं है
manuerumx
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.