2010-12-02 21 views
7

मैंने हाल ही में हमारी परियोजना की jQuery फ़ाइल को 1.4.2 से 1.4.4 में अपग्रेड किया है और ऐसा लगता है कि 1.4.3 जिस तरह से हम jQuery.data का उपयोग कर रहे हैं, काम करना बंद कर दिया है।jQuery.data अब विंडो के साथ काम नहीं करता है?

var events = $(window).data('events'); 

if (events.scroll) 
if (!events.scroll.include(handler)) 
    $(window).scroll(handler); 

उद्देश्य कई बार बाध्य किए जाने से इस विशेष हैंडलर को रोकने के लिए है:

हम इस कोड है।

1.4.2 में, यह ठीक काम करता है। 1.4.4 में, events अपरिभाषित है।

function handler() { 
    //do something 
} 

$(document).ready(function(){ 
    $(window).scroll(handler); 
    $('div#test').scroll(handler); 

    $(window).data('events') -> undefined 
    $('div#test').data('events') -> Object 
}); 

इस एपीआई के साथ क्या बदल गया? मुझे window के लिए ईवेंट कैसे सूचीबद्ध करना चाहिए?


मैं यह करने के लिए पहली पंक्ति को बदल दिया है:

var events = $(window).data('__events__').events; 

थोड़ा गंदा दिखने, लेकिन सादा वस्तुओं के लिए घटनाओं तार करने की क्षमता सम्मोहक है।

उत्तर

10

वहाँ घटना प्रकार के लिए 1.4.3+ jQuery में एक परिवर्तन, ऑब्जेक्ट नाम टकराव से बचने के लिए, window के लिए (या किसी अन्य सादे वस्तु) था कुंजी "__events__" का उपयोग करने के बजाय, इस तरह:

var events = $(window).data('__events__'); 

The same __events__ key is used for any objects that don't have a .nodeType property (जो window नहीं है, इसलिए इसे यहां एक साधारण वस्तु की तरह माना जाता है)।


स्पष्ट है कि यह एक जागरूक, जानबूझकर परिवर्तन किया गया है यह the jQuery 1.4.3 release notes में शामिल है:

जावास्क्रिप्ट ऑब्जेक्ट्स
परिवर्तन का एक नंबर जब .data() प्रयोग किया जाता है करने के लिए किए गए थे जावास्क्रिप्ट ऑब्जेक्ट्स पर (या, अधिक सटीक रूप से, कुछ भी जो डोम नोड नहीं है)। जब भी आप जावास्क्रिप्ट ऑब्जेक्ट पर डेटा सेट करते हैं, तब भी शुरू करने के लिए डेटा सीधे ऑब्जेक्ट पर सेट होता है - आंतरिक डेटा ऑब्जेक्ट स्टोर में जाने के बजाए। इसके अतिरिक्त वस्तुओं से जुड़ी घटनाओं को एक नई __events__ संपत्ति में रखा जाता है जो वास्तव में एक कार्य है। यह घटनाओं को सीधे किसी ऑब्जेक्ट से जोड़ने की अनुमति देने के लिए किया गया था, ऑब्जेक्ट एकत्र होने पर कचरा इकट्ठा किया जाना चाहिए, और JSON serializer द्वारा क्रमबद्ध नहीं किया जाना चाहिए। इन परिवर्तनों को जावास्क्रिप्ट ऑब्जेक्ट्स पर jQuery के डेटा और ईवेंट सिस्टम को और अधिक उपयोगी बनाना चाहिए।

+0

आह! कोई भी जो वास्तव में xD +1 में वास्तविक समस्या चरणों का कुछ विचार करता है – Matchu

4

The basic API still seems to work.

However, it doesn't seem to work on the window.

तो, jQuery से सौंपा घटनाओं तक पहुँचने के लिए एपीआई वास्तव में नहीं बदला है; यह अब खिड़की पर लागू नहीं होता है। यह वास्तव में एक जानबूझकर निर्णय की तरह नहीं लगता है, और 1.4.3 -> 1.4.4 changelog इसका कोई उल्लेख नहीं करता है।

एक बग की तरह लगता है, और इसे हाल ही में हुए बदलावों के साथ data पर करना पड़ सकता है, अब HTML5 data- विशेषताओं तक पहुंचने में सक्षम है। इसके लिए filing a ticket पर विचार करें:/

+0

यह 'विंडो' ऑब्जेक्ट के साथ काम नहीं करता है। फिर से जांचें। http://jsfiddle.net/dH4pz/ –

+0

@ एडम: संपादन :) – Matchu

+1

यह एक बग नहीं है, व्यवहार jQuery में जानबूझकर है 1.4.3+ –

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