2013-03-20 15 views
16

पृष्ठभूमिjQuery 1.9.1 संपत्ति चयनकर्ता

jQuery 1.9 .attr(..) विधि नहीं रह गया है संपत्ति मूल्यों रिटर्न के रूप में, बजाय हम अब .prop(..) उपयोग करना होगा। दुर्भाग्य से यह भी एक गुण चयनकर्ता के माध्यम से निर्दिष्ट यानी $("input[value=]")

विशेषताओं पर लागू होता है http://jquery.com/upgrade-guide/1.9/#attr-versus-prop-

और .attr और .prop के बीच मतभेद पर एक अच्छा अतः चर्चा देखें:

.prop() vs .attr()

मेरी स्थिति

मैं वर्तमान में $("input[value=]") और $("select[value=]") जैसे चयन तत्वों का चयन करने वाले इनपुट तत्वों का चयन करने के लिए चयनकर्ताओं का उपयोग कर रहा हूं। बहरहाल, यह नहीं रह गया jQuery 1.9 के साथ काम करता है, के बजाय मैं अब कुछ इस तरह कर रहा हूँ:

var hasValue = function() { return !!($(this).val().length); }; 
var hasNoValue = function() { return !($(this).val().length); }; 
$("input").filter(hasValue); 
$("select").filter(hasValue); 

मेरे वास्तविक चयनकर्ताओं, एक छोटे से बड़े होते हैं के साथ या मूल्यों के बिना तो अब मैं विभाजित करने के लिए आ रही है एक से अधिक तत्वों की जाँच .filter (..) विधि के साथ कई चयनकर्ताओं में मेरी 1 चयनकर्ता स्ट्रिंग के बीच में कॉल करता है।

प्रश्न

वहाँ $("[value=]"), $("[value!=]") को एक बराबर है, $("[value='abc']") जो विशेषता के बजाय संपत्ति का उपयोग करता है? और यदि नहीं, तो .filter(hasValue) और .filter(hasNoValue) विधियों का उपयोग करने से एक क्लीनर तरीका है?

धन्यवाद

+0

सुंदर मेरे लिए साफ लग रहा है और आपका वर्तमान समाधान इस बात पर ध्यान देता है कि उपयोगकर्ता इनपुट रहा है या नहीं) – ahren

+0

क्या यह '[value =]' के बजाय '[value]' नहीं होना चाहिए? या दोनों काम करते हैं? –

+0

मेरे लिए बस ठीक काम करता है -> [** फ़ील्ड **] (http://jsfiddle.net/ssPku/), और यह '[value =" "]' होना चाहिए क्योंकि केवल '[value]' किसी का चयन करेगा एक मूल्य विशेषता के साथ तत्व। – adeneo

उत्तर

12

का उपयोग .filter एक ही रास्ता होने लगता है, लेकिन यह बहुत बुरा नहीं है और आप वास्तव में यह एक छोटे से अधिक सटीक बना सकते हैं .val का उपयोग करके:

$(":input").filter(function() { return $(this).val() === ""; }); 

यदि यह वास्तव में है कि निन्दनीय है आप के लिए, आप एक कस्टम चयनकर्ता बना सकते हैं।

$.expr[':'].emptyInput = function (elem) { 
    return $(elem).is(":input") && $(elem).val() === ""; 
}; 

http://jsfiddle.net/ExplosionPIlls/zaZPp/

संपादित करें: आप भी this.value बजाय $(elem).val() का उपयोग कर के साथ भाग प्राप्त करने में सक्षम हो सकता है।

+0

हां, कस्टम अभिव्यक्ति बिल्कुल ठीक है जो मैं कर रहा हूं। यह सिर्फ एक वरीयता है, लेकिन मुझे लगता है कि '$ ("इनपुट: खाली इनपुट") जैसी एक अभिव्यक्ति अगले कोडर के लिए समझने में आसान है। धन्यवाद। – Walter

1

upgrade guide के अनुसार:

हालांकि

, जब की तरह एक चयनकर्ता "इनपुट [मूल्य = एबीसी]" प्रयोग किया जाता है, यह हमेशा मूल्य विशेषता के आधार पर चयन करना चाहिए और नहीं द्वारा संपत्ति में किए गए परिवर्तन उपयोगकर्ता, उदाहरण के लिए एक पाठ इनपुट में टाइपिंग। JQuery 1.9 के रूप में, यह सही और लगातार व्यवहार करता है। JQuery के पहले संस्करण कभी-कभी संपत्ति का उपयोग करते थे जब उन्हें विशेषता का उपयोग करना चाहिए था।

तो यह आपके पहले प्रश्न का उत्तर देता है - प्रत्यक्ष समकक्ष नहीं है, बिंदु संपत्ति के बजाय विशेषता का उपयोग करना है।

आपका कोड ठीक लगता है, लेकिन यदि आप अधिक मानकीकृत और पुनः उपयोग करने योग्य बनना चाहते हैं तो आप एक अतिरिक्त फ़िल्टर बना सकते हैं। इसलिए जैसा:

(function($) { 
    $.expr[':'].hasValue = function(element) { 
     var $element = $(element); 
     return element.is(':input') && element.val(); 
    }; 
}(window.jQuery)); 

यह आपको उस तरह सामान का चयन करने के लिए अनुमति देगा:

// Select input elements with value and select elements without value. 
$('input:hasValue,select:not(:hasValue)'); 

और अन्य विभिन्न संयोजनों आप की जरूरत है।

+0

मैंने अपग्रेड मार्गदर्शिका में उस अनुच्छेद को पढ़ा लेकिन यह मुझे निराश कर दिया क्योंकि उसने उस सटीक स्थिति के लिए एक विकल्प नहीं दिया था। मैं कुछ समकक्ष संपत्ति वाक्यविन्यास की उम्मीद कर रहा था जैसे '$ (" इनपुट {value = abc} ")'। लेकिन मेरी अपनी अभिव्यक्ति को परिभाषित करना उतना ही अच्छा है। उसी उत्तर के लिए +1 मैं बाद में था। – Walter

0

मैं इस पर आया और बस एक और समाधान पोस्ट करना चाहता था, मैंने पाया कि कुछ परिस्थितियों में काम करता है जहां कुछ अन्य सुझाए गए समाधान उपयुक्त नहीं हैं। (आपके पिछले समाधान के रूप में केवल मूल्य सेट से काम करेंगे जब डोम प्रारंभ किया गया था, और शायद अपने पिछले समाधान की तुलना में बेहतर -

बस इस ईवेंट हैंडलर अपने कोड में जोड़ने

$('input').on('keyup', function(){ 
     var value = $(this).val(); 
     $(this).attr('value', value); 
    }); 
संबंधित मुद्दे