2013-02-28 13 views
5

मैं इस तरह jQuery कोड का एक बहुत कुछ देखा है, कहने की मुझे यह पसंद नहीं है:jQuery घटना बाध्यकारी और हैंडलिंग

<div id="myDiv"> 
    <a class="clickable" href="#">Click Me</a> 
    <a class="clickable" href="#">Click Me</a> 
    <a class="clickable" href="#">Click Me</a> 
    <a class="clickable" href="#">Click Me</a> 
</div> 

<script> 
    $(document).ready(function(){ 
     $('clickable').click(function(){ 
      // Do some stuff... 
     }); 
    }); 
</script> 

मुझे पता है क्योंकि इसके बाद के संस्करण घटना बाध्यकारी और हैंडलिंग लोग ऐसा कर रहे हैं पृष्ठ पर एचटीएमएल संरचना उपलब्ध होने की आवश्यकता है, लेकिन यह वेब साइट के सभी विचारों, प्रस्तुति, तर्क और विन्यास को मिश्रित करने की ओर ले जाती है। इसके अलावा, यह तर्क को डीबग करना बहुत मुश्किल बनाता है, बस वहां किसी भी डीबगर के साथ।

तो, मैं इस तरह कोडिंग शुरू कर दिया है, एक अलग .js फ़ाइल पर (fiddle here):

// BEGIN: Event Handlers 
    var onLoad = function(){ 
     $('.clickable').data('clicked', false); 
    }; 
    var onMyDivClick = function(){ 
     var clicked = $(this).data('clicked'); 
     if (clicked) { 
      $(this).trigger('myCustomEvent'); 
     } else { 
      alert('you clicked me'); 
      $(this).data('clicked', true); 
     } 
    }; 
    var onMyCustomEvent = function(){ 
     $(this).css('color', 'dimGray'); 
     alert('please don\'t click me again'); 
    }; 
// END: Event Handlers 

// BEGIN: Event Binding 
    $(window).on('load', onLoad); 
    $(document).on('click', '.clickable', onMyDivClick); 
    $(document).on('myCustomEvent', '.clickable', onMyCustomEvent); 
// END: Event Binding 

अब, मैं संरचना पेज पर किया जा रहा है के बारे में परवाह करने की जरूरत नहीं। मुझे $(document).ready(function(){}); के अंदर सबकुछ लपेटने की ज़रूरत नहीं है और मुझे परवाह करने की ज़रूरत नहीं है कि संरचना को AJAX के साथ लोड किया जा रहा है या नहीं।

प्रश्न 1 क्या दृष्टिकोण पर कोई डाउनसाइड्स हैं? अब तक, मुझे कोई नहीं मिला है। लेकिन हमारी साइटों पर कोड के बड़े पैमाने पर प्रतिक्रिया करने से पहले, मैं संभावित चेतावनी के बारे में सुनना चाहता हूं।

प्रश्न 2 नवीनतम jQuery सुविधाओं के साथ यह दृष्टिकोण और भी आगे कैसे लिया जा सकता है?

उत्तर

1

इस दृष्टिकोण के साथ मुझे एक नकारात्मक जानकारी है। यह इवेंट प्रदर्शन अनुभाग .on() में लिखा गया है।

दस्तावेज़ पेड़ के शीर्ष के पास कई प्रतिनिधि कार्यक्रम हैंडलर संलग्न करना प्रदर्शन को कम कर सकता है। प्रत्येक बार ईवेंट होने पर, jQuery को उस प्रकार की सभी संलग्न घटनाओं के सभी चयनकर्ताओं को तुलनात्मक रूप से दस्तावेज़ के शीर्ष तक ईवेंट लक्ष्य से पथ में प्रत्येक तत्व की तुलना करनी चाहिए। सर्वोत्तम प्रदर्शन के लिए, लक्षित तत्वों के लिए जितना संभव हो सके दस्तावेज़ स्थान पर प्रतिनिधि कार्यक्रम संलग्न करें। बड़े दस्तावेजों पर प्रतिनिधि कार्यक्रमों के लिए दस्तावेज़ या दस्तावेज़। के अत्यधिक उपयोग से बचें।

तो सभी घटनाओं को document पर बाध्य करने के बाद, यह और भी खराब होगा।

और अतिरिक्त नोट्स में, वहाँ कुछ बात ऐसी load, scroll, और error के रूप में इस दृष्टिकोण के साथ काम नहीं कर सकता, कर रहे हैं।

+0

तो, ऑनलोड के अलावा, बाकी घटना को ऑनलोड के भीतर संभालने के लिए आगे बढ़ाना और उन्हें लक्ष्य के रूप में जितना संभव हो सके संलग्न करें: http://jsfiddle.net/codepic/8pE6z/2/ हालांकि, यह काफी प्रभावी ढंग से नष्ट कर देता है AJAX के साथ लोड नियंत्रण पर घटना हैंडलिंग। जब भी 'नियंत्रण' लोड होता है तो शायद मुझे एक कस्टम ईवेंट ट्रिगर करने की आवश्यकता होती है। इस तरह: http://jsfiddle.net/codepic/8pE6z/3/ इस तरह, दस्तावेज़ तत्व पर केवल एक ईवेंट हैंडलर होगा जो .control की तलाश करता है और शेष घटना लक्ष्य के करीब बाध्यकारी करता है। –

0

ढांचे की जांच करें, उन्होंने आपके लिए बॉयलर-प्लेट काम किया है। मैंने अभी तक नॉकआउट का उपयोग किया है, लेकिन मैं कुछ अन्य लोगों से जुड़ूंगा।

"नमस्ते दुनिया" नॉकआउट में:

http://knockoutjs.com/examples/helloWorld.html

<p>First name: <input data-bind="value: firstName" /></p> 
<p>Last name: <input data-bind="value: lastName" /></p> 
<h2>Hello, <span data-bind="text: fullName"> </span>!</h2> 

// Here's my data model 
var ViewModel = function(first, last) { 
    this.firstName = ko.observable(first); 
    this.lastName = ko.observable(last); 
    this.fullName = ko.computed(function() { 
     // Knockout tracks dependencies automatically. It knows that fullName depends on firstName and lastName, because these get called when evaluating fullName. 
     return this.firstName() + " " + this.lastName(); 
    }, this); 
}; 

ko.applyBindings(new ViewModel("Planet", "Earth")); // This makes Knockout get to work 
+1

लिंक के लिए धन्यवाद। मैं कम से कम नॉकआउट में देख रहा हूं और उपर्युक्त ढांचे में से एक को लागू करने की योजना बना रहा हूं। लेकिन सबसे पहले मुझे मौजूदा प्लेटफार्म पर कस्टम यूआई तर्क को साफ करने की आवश्यकता है और यूआई लोगों को सर्वोत्तम संभव शुद्ध jQuery दृष्टिकोण के साथ वहां से जारी रखने की आवश्यकता है। आप जानते हैं, वे सभी jQuery के लिए उपयोग किए जाते हैं, इसलिए उन्हें एक नया ढांचा फेंकना, जबकि उन्हें अभी भी वर्तमान में सुधार करने की आवश्यकता है, फिर भी गड़बड़ी को एक और ढांचे के साथ फिर से बनाना होगा। लेकिन हां, जब मैं डेटा बाध्यकारी और अच्छी तरह से संरचित AJAX नियंत्रणों को बनाते हैं, तो उल्लिखित समाधान सही फिट होते हैं। –

+0

अच्छी तरह से संतुलित दृष्टिकोण। संपादित करें - जब तक "कोड का बड़ा हिस्सा" पर्याप्त न हो। यदि ऐसा है, तो 2 बड़े बदलाव क्यों करें? –

+0

ओएच ओएच! यदि आप अपने यूआई पीपीएल के लिए केओ के लिए ट्यूटोरियल चाहते हैं, तो http://learn.knockoutjs.com/ पर फ्रीबी। –

0

यह मेरे लिए इंजीनियरिंग पर चिल्लाता है। Document.ready में कोड से बचने के लिए, और दृश्य में तर्क देखने से बचें, आप और भी जटिलता पेश करते हैं।

आपका दृष्टिकोण सीधे दस्तावेज़ पर बाध्य करता है और उसके बाद क्लिक किए जाने वाले डोम की जांच करता है। फिर आप क्लिक करने के लिए एक दूसरी घटना को आग लगाते हैं, जहां आपका तर्क रहता है।

यह एक या दो तत्वों के लिए ठीक है। यह आपका ठेठ ऐप नहीं है। क्या होता है जब आपके पास 5 तत्व होते हैं जिन्हें सभी को कुछ अलग करने की आवश्यकता होती है? लगभग 10 कैसे? शायद 15?

आपका "सरल" ईवेंट हैंडलर एक अच्छा बड़ा स्विच (या बदतर, ifs और nested ifs) बनने जा रहा है। अचानक एक नया हैंडलर जोड़ना इतना आसान नहीं है। न ही एक मौजूदा घटना बदल रहा है।

आप एक ढांचे को देखने से कहीं बेहतर होंगे जो आपको वह अलगाव प्रदान करता है जो आप ढूंढ रहे हैं। जूते को "मदद" करने के लिए इस तरह कुछ जूता करने का प्रयास करना आपके कोड को काटने के लिए वापस आ जाएगा। कोड में सबसे जटिलता एक इंजीनियर से पैदा होती है जो इसे "सरल" और "बेहतर" और "भविष्य का सबूत" बनाती है।

यह आपको या आपके विचारों को खारिज नहीं करना है। आपके पास सही विचार है: जिम्मेदारी को अलग करना एक अच्छी बात है। मुझे नहीं लगता कि आपका दृष्टिकोण सबसे अच्छा है।

जैसा कि एक अन्य पोस्ट किया गया है, कोणीय और रीढ़ की हड्डी और एम्बर (और कई और) आप जो चाहते हैं उसे पूरा करने के साधन प्रदान करते हैं। इसके अलावा, आपको जो भी लाइब्रेरी आपने चुना है उसे बनाए रखने की ज़रूरत नहीं है :)

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