2009-07-29 14 views
26

अद्यतन: jQuery 1.4 के रूप में, $.live() अब Focusin और focusout घटनाओं का समर्थन करता है।"ध्यान" और jQuery .live() विधि में "कलंक" का अनुकरण करना


jQuery वर्तमान में "कलंक" या $.live() विधि के लिए तर्क के रूप में "ध्यान" का समर्थन नहीं करता। क्या प्रकार के काम के आसपास मैं निम्नलिखित प्राप्त करने के लिए लागू कर सकते हैं:

$("textarea") 
    .live("focus", function() { foo = "bar"; }) 
    .live("blur", function() { foo = "fizz"; }); 

। 07/29/2009, संस्करण 1.3.2

+0

$ ('पाठ क्षेत्र')। बाँध ('फोकस') काम करता है ... अपने कोड नमूने में आपका मतलब है "लाइव()" नहीं है ?? – James

+0

हां। उसके लिए माफ़ करना। – Sampson

उत्तर

31

कार्य समाधान:

(function(){ 

    var special = jQuery.event.special, 
     uid1 = 'D' + (+new Date()), 
     uid2 = 'D' + (+new Date() + 1); 

    jQuery.event.special.focus = { 
     setup: function() { 
      var _self = this, 
       handler = function(e) { 
        e = jQuery.event.fix(e); 
        e.type = 'focus'; 
        if (_self === document) { 
         jQuery.event.handle.call(_self, e); 
        } 
       }; 

      jQuery(this).data(uid1, handler); 

      if (_self === document) { 
       /* Must be live() */ 
       if (_self.addEventListener) { 
        _self.addEventListener('focus', handler, true); 
       } else { 
        _self.attachEvent('onfocusin', handler); 
       } 
      } else { 
       return false; 
      } 

     }, 
     teardown: function() { 
      var handler = jQuery(this).data(uid1); 
      if (this === document) { 
       if (this.removeEventListener) { 
        this.removeEventListener('focus', handler, true); 
       } else { 
        this.detachEvent('onfocusin', handler); 
       } 
      } 
     } 
    }; 

    jQuery.event.special.blur = { 
     setup: function() { 
      var _self = this, 
       handler = function(e) { 
        e = jQuery.event.fix(e); 
        e.type = 'blur'; 
        if (_self === document) { 
         jQuery.event.handle.call(_self, e); 
        } 
       }; 

      jQuery(this).data(uid2, handler); 

      if (_self === document) { 
       /* Must be live() */ 
       if (_self.addEventListener) { 
        _self.addEventListener('blur', handler, true); 
       } else { 
        _self.attachEvent('onfocusout', handler); 
       } 
      } else { 
       return false; 
      } 

     }, 
     teardown: function() { 
      var handler = jQuery(this).data(uid2); 
      if (this === document) { 
       if (this.removeEventListener) { 
        this.removeEventListener('blur', handler, true); 
       } else { 
        this.detachEvent('onfocusout', handler); 
       } 
      } 
     } 
    }; 

})(); 

आईई/एफएफ/क्रोम में परीक्षण किया गया। जैसा कि आप इरादा करते हैं ठीक उसी तरह काम करना चाहिए।

अद्यतन: टियरडाउन अब काम करते हैं।

+4

अब jQuery बग ट्रैकर पर जाएं और पैच प्रदान करें। बहुत बढ़िया। –

+0

यहां 'टियरडाउन' के लिए 'मर() 'मार्ग होगा? –

+1

हाँ, मुझे ऐसा लगता है ... jQuery पृष्ठभूमि में अधिकांश का ख्याल रखता है ("हैंडलिंग" सहित)।बस टियरडाउन अपडेट किया गया ताकि उपयुक्त घटनाएं अलग हो जाएं। – James

2

live()event delegation पर jQuery का शॉर्टकट है। अपने प्रश्न का उत्तर देने के लिए, Delegating the focus and blur events देखें।

यह बहुत सरल है: मानकों के अनुरूप ब्राउज़र के लिए वह उन घटनाओं को फँसाने के लिए event capturing का उपयोग करता है। आईई के लिए वह आईई के मालिकाना focusin (focus के लिए) और focusout (blur के लिए) घटनाओं का उपयोग करता है, जो परंपरागत घटना प्रतिनिधिमंडल की अनुमति देते हुए बबल करते हैं।

मैं इसे व्यायाम के रूप में jQuery पर पोर्टिंग छोड़ दूंगा।

+1

बंदरगाह था :) (मेरा जवाब देखें) – James

0

एक और अतिरिक्त: यह समाधान एक से अधिक पैरामीटर का समर्थन नहीं करता है।

मैं करने की कोशिश की:

$(el).live("focus blur", function(e) { 
    if (e.type == "focus") { 

आदि

और यह केवल कलंक घटना निकाल दिया।

फिर भी यह समाधान सहायक रहा है।

5

यह कार्यक्षमता अब jQuery कोर (1.4.1 के रूप में) में शामिल है।

+4

मैंने इसे पहले से ही अपने प्रश्न में नोट किया। – Sampson

2

वे jQuery 1.4.1 पर जोड़ दिया गया है ... अब .live() फ़ंक्शन fucus का समर्थन करता है और घटनाओं को धुंधला =) अभिवादन

2

जब event.type यह रिटर्न "Focusin" जाँच कर रहा है समस्या की तरह लग रहा & "focusout"

$('input').live("focus blur", function(event){ 
    if (event.type == "focusin") { 
     console.log(event.type); 
    }else{ 
     console.log(event.type); 
    } 
}); 
संबंधित मुद्दे