2012-07-26 21 views
6

मैं जब strict mode में उल्लिखित here मूल विचार के बारे में this एक method में किया जा रहा नहीं मिलता है, लेकिन यह थोड़ा बहुश्रुत हो जाता है, ईमानदार होना। तो, में और अधिक नीरस शर्तें:jQuery कॉलबैक - सख्त उल्लंघन

मैं बहुत की तरह एक हैंडलर है:

$('.myClass').one('keyup', function() { 
    var $this = $(this); 
    etc etc 
}); 

मैं यह करने के लिए इसे बदलना चाहते:

function myFunction() { 
    var $this = $(this); 
    etc etc 
}; 
$('.myClass1').one('keyup', myFunction); 
$('.myClass2').one('keyup', myFunction); etc 

यह क्योंकि strict mode में यह पसंद नहीं करता क्योंकि मैं एक विधि के बाहर this का उपयोग कर रहा हूँ। मै समझ गया।

हालांकि, मैं क्योंकि (1) यह विभिन्न कक्षाओं/तत्वों और (2) मैं .off().one('keyup', myFunction) उपयोग कर रहा हूँ विभिन्न बिंदुओं पर विभिन्न कक्षाओं के लिए one हैंडलर रीसेट करने से अनुलग्न है, हैंडलर को myFunction अलग की आवश्यकता है।

तो this व्यवसाय का उल्लंघन किए बिना मैं अलग कॉलबैक फ़ंक्शन कैसे प्राप्त करूं?

+0

प्रश्न के स्वीकार किए जाते हैं जवाब का प्रयास करें फ़ंक्शन कथन को फ़ंक्शन अभिव्यक्ति के साथ प्रतिस्थापित करने के लिए आप सुझाव देते हैं। क्या आपने कोशिश की? –

+0

सख्त मोड – Imdad

+0

का उपयोग न करें फ़ंक्शन के अंदर इसका उपयोग करने में कुछ भी गलत नहीं है। यह देखते हुए कि "विधियों" वास्तव में वस्तुओं से संबंधित नहीं हैं (वे केवल वे गुण हैं जो _somewhere_ परिभाषित कार्यों को संदर्भित करते हैं, और संभवतः अन्य वस्तुओं के साथ साझा किए जाते हैं) मुझे नहीं लगता कि आपत्ति क्या है। – nnnnnn

उत्तर

6

के बारे में मैं यह जब कठोर मोड में एक विधि में नहीं किया जा रहा मूल विचार मिलता है ...

हाँ, पर आप दो असंबंधित बातें भ्रमित कर रहे हैं: सख्त मोड, और JSLint। वे काफी हद तक असंबंधित हैं (सिवाय इसके कि जेएसलिंट के पास सख्त मोड की आवश्यकता है)।

सख्त मोड में आपके कोड के साथ कोई समस्या नहीं है। यह पूरी तरह से वैध और उपयुक्त है (इस कारण कि jQuery this का उपयोग कैसे करता है)। Exampleकोई "सख्त उल्लंघन" है।

जेएसलिंट इसे पसंद नहीं करता है, लेकिन जेएसलिंट को ऐसी कई चीजें पसंद नहीं हैं जो पूरी तरह से वैध और उपयुक्त हैं। जेएसलिंट उन चीजों के संयोजन का पता लगाता है जो बहुत व्यापक रूप से मान्यता प्राप्त हैं (जैसे अर्धविराम गायब), और डगलस क्रॉकफ़ोर्ड को शैली परिप्रेक्ष्य से पसंद नहीं है। क्रॉकफोर्ड के बुद्धिमान और अच्छी तरह से सूचित, लेकिन हर कोई अपने स्टाइल विकल्पों से सहमत नहीं है।

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

+0

यह वास्तव में सहायक है। मैं Aptana के अंतर्निहित जेएसलिंट का उपयोग करता हूं, और त्रुटि "सख्त उल्लंघन" बस इतना सुना ... आधिकारिक :) – Nick

+0

@ निक: एक! दरअसल, मुझे एहसास नहीं हुआ कि यह इस तरह का phrased था (लेकिन jslint.com पर एक त्वरित जांच यह पुष्टि करता है)। क्लासिक क्रॉकफ़ोर्ड ... :-) –

1

क्या आप इसके बजाय ईवेंट ऑब्जेक्ट का उपयोग नहीं कर सकते?

यानी।

function myFunction (e) { 
    var $this = $(e.currentTarget); 
}; 

उदाहरण: http://jsfiddle.net/gRoberts/cRnb3/

+0

jQuery दस्तावेज़ों का कहना है कि हमेशा नहीं, 'event.target' घटना को गहरा (आंतरिकतम) तत्व इंगित करता है जहां ईवेंट हुआ, इसलिए' यह 'ईवेंट' लक्ष्य 'के बराबर नहीं हो सकता है यदि ईवेंट एक वंशज तत्व से बुलबुला है। –

0

आप घटना-वस्तु पारित कर दिया गर्त की currentTarget, की तरह पढ़ सकता है:

function myFunction (event) { 
    var $this = $(event.currentTarget); 
    etc etc 
}; 
$('.myClass1').one('keyup', myFunction); 
$('.myClass2').one('keyup', myFunction); etc 
0

इस

function myFunction() { 
    var $this = $(this); 
    etc etc 
}; 
var obj= $('.myClass1'); 
obj.myFunction =myFunction ; 

obj.one('keyup', myFunction); 
obj.one('keyup', myFunction); etc 
संबंधित मुद्दे