2011-06-12 10 views
10

मैं इस class plugin का उपयोग कर JQuery में एक Mootools टूलटिप क्लास को फिर से लिखने की कोशिश कर रहा हूं। जब मेरी कक्षा को तुरंत चालू किया जाता है तो मैं एक ईवेंट श्रोता को एक लक्षित लिंक से जोड़ रहा हूं जो टूलटिप को फीका कर देगा।म्यूटूल के बराबर JQuery समतुल्य (यह)

घटना कॉलबैक में JQuery घटना के लक्ष्य पर "यह" कीवर्ड निर्दिष्ट करता है, इसलिए कक्षा के गुणों का संदर्भ देने के लिए "इस" को सेट करने के लिए क्लास के गुणों का संदर्भ रखने के लिए मैं() "का उपयोग कर रहा हूं। यह स्पष्ट रूप से Mootools के आसान bind() फ़ंक्शन के JQuery में समकक्ष है।

दुर्भाग्यवश जब मैं लागू करता हूं() मैं कॉलबैक के ईवेंट पैरामीटर को खो देता हूं। उदाहरण के लिए, इस बिट में मुझे दूसरी पंक्ति पर "ई अनिर्धारित" त्रुटि मिलती है।

this.target.bind('click', function(e){ 
    e.preventDefault(); 
    var tip = this.opts.tip; 
    tip.fadeOut(500, function(){ 
     tip.bind('click', function(){ 
      showing = false; 
     }) 
    }); 
}.apply(this)) 

क्या मुझे यहां एक चाल याद आ रही है? क्या कोई इस मुद्दे के आसपास एक रास्ता जानता है?

धन्यवाद फ्रेड

उत्तर

18
की ओर इशारा करते होना चाहिए

टीबीएच, mootools.bind जैसा कि आप इसे कॉल करते हैं, यह केवल ईएस 5 में Function.bind है - और जेएस 1.8.5 + spec का समर्थन करने वाले ब्राउज़र में मूल रूप से उपलब्ध है। MooTools केवल उन ब्राउज़रों को बढ़ाता है जिनके पास अभी तक नहीं है लेकिन मूल कार्यान्वयन प्रोटोटाइप पर उपलब्ध होने देता है - यदि उपलब्ध हो।

https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Function/bind

आप आसानी से आ Function.prototype.bind डेकोरेटर नहीं तो उपलब्ध देशी रूप के रूप में है कि लागू करने और इसका इस्तेमाल कर सकते हैं के रूप में उपरोक्त उदाहरण का कहना है:

// Function.prototype.bind polyfill 
if (!Function.prototype.bind) { 

    Function.prototype.bind = function(obj) { 
    if(typeof this !== 'function') // closest thing possible to the ECMAScript 5 internal IsCallable function 
     throw new TypeError('Function.prototype.bind - what is trying to be bound is not callable'); 

    var slice = [].slice, 
     args = slice.call(arguments, 1), 
     self = this, 
     nop = function() {}, 
     bound = function() { 
      return self.apply(this instanceof nop ? this : (obj || {}), 
           args.concat(slice.call(arguments)));  
     }; 

    bound.prototype = this.prototype; 

    return bound; 
    }; 
} 

आप देख सकते हैं, यह एक की तुलना में थोड़ा अधिक शामिल है सरल .apply/.call

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

उदाहरण के लिए।

var self = this; 
this.target.bind("click", function(e) { 
    var tip = self.opts.tip; 
}); 

इस पर फ़ंक्शन बाध्यकारी की तुलना में इसका एक छोटा पदचिह्न है। यह आपको ट्रिगर तत्व (event.target === this) के रूप में this का सही संदर्भ भी प्रदान करता है।

this.element.addEvents({ 
    click: this.showTip.bind(this), 
    mouseleave: this.hideTip.bind(this) 
}); 

इस मामले में, बचत एक संदर्भ जीता ': जब आप वर्ग के तरीकों, जैसे करने के लिए घटनाओं प्रदान करना चाहते हैं, हालांकि बाँध अक्सर की जरूरत है - आप बाँध एक से mootools कोर में कहीं अधिक अक्सर इस पैटर्न मिलेगा http://api.jquery.com/jquery.proxy/

+0

डिमिटार आप जेएस के चलने वाले विश्वकोष हैं! विस्तृत स्पष्टीकरण के लिए धन्यवाद।इस स्थिति में संदर्भ का आपका सुझाव सबसे अच्छा प्रतीत होता है, इसलिए मैं ऐसा करूंगा: '\t var self = this; \t this.target.bind ('क्लिक', समारोह (ई) { \t \t e.preventDefault(); \t \t self.toggleTip(); \t}) ' मेरी init विधि, में जहां toggleTip () एक अलग क्लिक कॉलबैक है। महान सलाह, धन्यवाद! –

+0

@ डिमिटार: वास्तव में बहुत अच्छा काम करता है। thnx। (एट) सभी: ध्यान दें कि कार्यात्मक प्रोग्रामिंग की इस तकनीक को करीइंग (http://www.dustindiaz.com/javascript-curry/) कहा जाता है। jQuery में विधि नाम 'बाइंड' का समान प्रोटोटाइप एक्सटेंशन है जो शायद कुछ उलझन में है क्योंकि इसका उपयोग गैर-फ़ंक्शंस को संभालने और घोषित करने के लिए किया जाता है। JQuery में इसी उद्देश्य के लिए $ .ajax में संदर्भ का भी उपयोग किया जाता है। –

0

सभी घटनाओं, कि कुछ तत्व पर किया जाता है (उदाहरण के लिए 'क्लिक' उनमें से एक है) लक्ष्य संपत्ति उस तत्व

var $this = $(e.target); // $this will be the clicked element 

JSFiddle

+0

धन्यवाद mkilmanas - - काम नहीं ही आप एक jQuery विशेष कार्यान्वयन के रूप में

var self = this; this.element.addEvents({ click: function(e) { self.showTip(e); } }); 

यह पुनर्लेखन कर सकते हैं proxy है कि संपत्ति मैं उपयोग करने के लिए उम्मीद कर रहा था। दुर्भाग्यवश जब मैंने अपने फ़ंक्शन के अंत में लागू() जोड़ा (तो मैंने इसका उपयोग खो दिया। –

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