2013-08-16 3 views
9

इंटरनेट एक्सप्लोरर 10 स्थानीय स्टोरेज में संग्रहीत उसी विंडो पर विंडो "स्टोरेज" ईवेंट को सक्रिय करता है।इंटरनेट एक्सप्लोरर डेटा संग्रहीत विंडो पर विंडो "स्टोरेज" ईवेंट क्यों आग लगाता है?

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

उत्तर

9

माइक्रोसॉफ्ट इस मुद्दे से अवगत हो रहा है, लेकिन यह नहीं लगता है जैसे वे किसी भी समय इसे जल्द ही ठीक करने के लिए जा रहे हैं: https://connect.microsoft.com/IE/feedback/details/774798/localstorage-event-fired-in-source-window

एक विकल्प है कि आप अपने श्रोताओं और setters डिजाइन कर सकते हैं इतना है कि वे जब वे किसी ऐसे संग्रहण ईवेंट से जानकारी प्राप्त करते हैं जो पहले से ही उनके राज्य के अनुरूप है, तो प्रतिक्रिया न करें या स्टोर न करें। हालांकि, यह डिज़ाइन पैटर्न केवल अन्य विंडो पर फायरिंग स्टोरेज ईवेंट पर निर्भर होने से अधिक कठिन हो सकता है।

एक और विकल्प स्थानीय भंडारण को आईई में समान तरीके से काम करना है जो यह अन्य ब्राउज़रों में काम करता है। मैं एक स्वीकार्य रूप से हैकी लेकिन कार्यात्मक समाधान के साथ आया जिसकी मैंने आईई 10 में परीक्षण किया और आईई 8 और आईई 9 में काम करने की उम्मीद की। मेरे जावास्क्रिप्ट घटक विंडो "स्टोरेज" ईवेंट को सीधे नहीं सुनते हैं बल्कि इसके बजाय बनाए गए 'ईवेंट प्रेषक' को सुनते हैं। इवेंट डिस्पैचर विंडो "स्टोरेज" ईवेंट को सुनता है और उस विंडो में उत्पन्न स्टोरेज इवेंट को अनलॉक करता है और रीढ़ की हड्डी की घटना को ट्रिगर करता है। जिस तरह से मैं इस विंडो यह मान संग्रहीत setItem() कि मूल्य के लिए एक अद्वितीय ID बनाता है और इस तरह यह का ट्रैक रखता है, फोन करने के लिए एक कस्टम विधि का उपयोग कर रही है तो:

eventDispatcher.set = function(key, value) { 
    var storageId = (new Date()).getTime(); 
    eventDispatcher.idList.push(storageId); 
    localStorage.setItem(key, {value: value, id: storageId}); 
} 

और मेरे eventDispatcher को सुनता है भंडारण की घटनाओं और एक घटना से चलाता है केवल यदि आईडी यह बनाई गई इस मूल्य की आईडी शामिल नहीं है, इस तरह की अपनी सूची:

$(window).on('storage', dispatchStorageEvent); 
function dispatchStorageEvent(event) { 
    var newValue = JSON.parse(event.originalEvent.newValue); 
    if (eventDispatcher.idList.indexOf(newValue['id']) > -1) { 
    return; 
    } 
    eventDispatcher.trigger("storageEvent:" + event.originalEvent.key, newValue['value']); 
} 

वहाँ थोड़ा अधिक कोड आप idList कम रखने के लिए और के रूप में बनाना जोड़ सकते हैं पहली जगह में एक खाली सरणी, लेकिन मैंने स्पष्टता के लिए इसे छोड़ दिया। स्टोरेज इवेंट्स को संभालने के लिए इवेंट डिस्पैचर बनाना थोड़ा ओवरहेड है, लेकिन यह आपके विकास को ब्राउज़र के बीच सुसंगत बना सकता है। एक कम हैकी समाधान उचित लॉकिंग और क्यूइंग तंत्र का उपयोग करेगा, लेकिन यह बहुत मुश्किल हो सकता है।

+1

क्या आपके पास कोई भी मौका है कि आपका ग्राहक ईवेंट प्रेषक कैसा दिखता है? – Jesse

+2

जेसी, देखें कि इसे कैसे हल किया गया था https://github.com/Shadez/ls-notifier/blob/master/js/notifier.js – Denis

+1

इस उत्तर में महत्वपूर्ण जानकारी गुम है। – Cerbrus

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