2010-01-13 16 views
27

क्या jQuery के val() फ़ंक्शन को आसानी से ओवरराइड करने का कोई तरीका है?jQuery .val() फ़ंक्शन ओवरराइड करें?

कारण मैं इसे ओवरराइड करना चाहता हूं कि जब भी किसी तत्व के लिए मान सेट किया जाता है तो मैं कुछ प्रोसेसिंग जोड़ना चाहता हूं। और मैं myVal() जैसे एक और कस्टम वैल्यू सेटर नहीं बनाना चाहता हूं।

+0

मुझे लगता है कि .change() घटना आपके लिए यहां काम नहीं करती है? –

+0

@ मार्क: जब मैंने $ ('# foo') करके तत्वों का मूल्य निर्धारित किया है। वैल ('someValue') .change() ईवेंट ट्रिगर नहीं होता है। यह केवल तब ट्रिगर होता प्रतीत होता है जब उपयोगकर्ता द्वारा GUI/ब्राउज़र पर मान बदल दिया जाता है। – 7wp

+0

$ ('# foo')। वैल ('कुछ वैल्यू')। ट्रिगर ('बदलें'); उस समय ट्रिगर को चेन करने के लिए उपयोग किया जा सकता है ... –

उत्तर

46

आप मूल val समारोह के लिए एक संदर्भ स्टोर कर सकते हैं तो इसे ओवरराइड करने और अपने प्रसंस्करण करते हैं, और बाद में call साथ यह आह्वान, सही संदर्भ का उपयोग करें:

(function ($) { 
    var originalVal = $.fn.val; 
    $.fn.val = function(value) { 
    if (typeof value != 'undefined') { 
     // setter invoked, do processing 
    } 
    return originalVal.call(this, value); 
    }; 
})(jQuery); 

ध्यान दें कि आप एक के बीच अंतर कर सकते हैं तर्क undefined है या नहीं, यह जांचकर गेटर कॉल $(selector).val(); और एक सेटर कॉल $(selector).val('new value'); बस कॉल करें।

+0

धन्यवाद, बहुत सराहना की। – 7wp

+4

यह काम नहीं करेगा (कम से कम jQuery 1.7 में नहीं)। मूल jQuery फ़ंक्शन तर्क गणना पर निर्भर करता है, इसलिए यह मूल वैल() विधि कॉल को हमेशा एक सेटटर पर विचार करेगा। इसे ठीक करने के लिए, "मूल मूल Vall.call (यह, मान) वापस बदलें;" "मूल वापसी करें। ठीक है (यह, तर्क);" – dkl

+4

न तो मूल, न ही @ डीकेएल द्वारा प्रस्तावित परिवर्तन क्रोम के साथ काम करता है। यदि आप प्राप्त कर रहे हैं या सेटिंग काम करते हैं तो यह जांचने के लिए किसी भी प्रकार का उपयोग करना। एक पारदर्शी ओवरराइड है, आवश्यकतानुसार बदलें। (समारोह ($) { वर originalVal = $ .fn.val; $ .fn.val = समारोह (मूल्य) { अगर (typeof मूल्य == 'अनिर्धारित') { वापसी originalVal.call (this); } अन्य { मूल वापसी करें Val.call (यह, मान); } }; }) (jQuery); – Martijn

1

मैं तुम्हें सही, कुछ इस तरह ठीक चाल करना चाहिए समझने रहा हैं: चयन के लिए हो रही मूल्यों और इतने पर:

jQuery.fn.val = function (new_val) { 
    alert("You set a val! How wonderful!"); 
    this.value = new_val; 
}; 

बस सुनिश्चित करें कि आप नियमित रूप से कार्यक्षमता शामिल हैं। नियमित jQuery लाइब्रेरी के बाद के बाद उस कोड को पर चिपकाएं।

+0

मूल व्यवहार की प्रतिलिपि न लें, वैल() फ़ंक्शन के अन्य ओवरराइड के साथ आगे संगतता और संगतता सुनिश्चित करने के लिए इसे स्पष्ट रूप से कॉल करें। – Martijn

+0

@ मार्टिजन: अगर मुझे दो साल पहले पता था कि अब मुझे क्या पता है, तो मैंने ऐसा किया होगा। लेकिन दुर्भाग्य से इसके लिए थोड़ा देर हो चुकी है। – Reid

2

मुझे पता है कि समस्या पुरानी है लेकिन सिर्फ एक पूर्ण समाधान देने के लिए। ओवरराइड के बाद काम करने के लिए jQuery.val() और jQuery.val (मान) दोनों के लिए आपको इसे ठीक से और अलग से ओवरराइड करने की आवश्यकता है। क्योंकि jQuery.val() को कॉल करते समय मूल Val.call (यह, मान); सही ढंग से काम नहीं करेगा।

इसे सही तरीके से करने के लिए आपको मूल्य प्राप्त करते समय ऐसा करने की आवश्यकता है: originalVal.call (यह);

यहाँ एक साइट है, जहां सब कुछ समझाया गया है है: http://extremedev.blogspot.com/2012/01/override-jqueryval-and-jqueryvalvalue.html

सादर, रोमन

+5

धन्यवाद रोमन मुझे पहले से ही पता था, लेकिन आप अपनी साइट के लिए यहां कुछ आत्म प्रचार कर रहे हैं। यदि आप कम से कम अपना पूरा जवाब स्टैक ओवरफ़्लो में पेस्ट करेंगे तो यह अधिक उपयोगी होगा। इस तरह यदि आपकी साइट कभी भी इंटरनेट से गायब हो जाती है, तो लोगों के देखने के लिए आपका उत्तर अभी भी इस साइट पर बरकरार रहेगा। यह रोमन बहुत उपयोगी होगा। हालांकि आपके प्रयास के लिए धन्यवाद। – 7wp

+1

@ 7wp +1 अच्छी टिप्पणी। –

+0

अच्छा होगा अगर वह कोड भी काम करता है! jQuery से कोशिश करने और हल करने से पहले "widgetElementId" कहां परिभाषित किया गया है? –

15

मैं जानता हूँ कि यह एक पुराने विषय है लेकिन यह गूगल खोज में पहला है और जवाब पूरी तरह से सही नहीं है ...

उदाहरण के लिए यदि आप कंसोल $('#myinput').val() में प्रयास करते हैं तो आपको #myinput का मान प्राप्त करना चाहिए।

लेकिन आप #myinput का मूल्य! स्थापित करना चाहिए अगर आप $('#myinput').val(undefined) कर ( वर्तमान जवाब के साथ और इसके बारे में टिप्पणी, आप #myinput का मान सेट नहीं होगा)

यहाँ एक उन्नत जवाब है कि arguments का उपयोग करें।

(function ($) { 
    var originalVal = $.fn.val; 
    $.fn.val = function(value) { 
    if (arguments.length >= 1) { 
     // setter invoked, do processing 
     return originalVal.call(this, value); 
    } 
    //getter invoked do processing 
    return originalVal.call(this); 
    }; 
})(jQuery); 

यदि आप सभी तर्क आप भी

(function ($) { 
    var originalVal = $.fn.val; 
    $.fn.val = function(value) { 
    if (arguments.length >= 1) { 
     // setter invoked, do processing 
    } else { 
     //getter invoked do processing 
    } 
    return originalVal.apply(this, arguments); 
    }; 
})(jQuery); 

लागू मुझे आशा है कि यह मदद का उपयोग कर सकते पास करना चाहते हैं!

+0

महान जवाब! अच्छी तरह से काम। – Rajesh

0

मैं सीएमएस जवाब में जोड़ने के लिए कुछ है, मेरे कार्यान्वयन अलग होता है और हो सकता है इस तरह:

(function ($) { var fnVal = $.fn.val; 
    $.fn.val = function(value) { 
     if (typeof value == 'undefined') { 
      return fnVal.call(this); 
     } 
     var result = fnVal.call(this, value); 
     $.fn.change.call(this); 
     // here you can add some more implementation 
     return result; 
    }; 
})(jQuery); 

$ .fn.change निरीक्षण।फोन (this); को वैल ('') फ़ंक्शन से बाहर जाने से पहले बुलाया जाएगा, यह प्रत्येक वैल (') असाइनमेंट पर .change() को भी ट्रिगर करेगा।

संबंधित मुद्दे