2012-04-21 11 views
11

मैं सफलतापूर्वक localStorage (jQuery का उपयोग) करने के लिए एक बदलाव के लिए एक घटना बाध्य कर सकते हैं:मैं सत्र स्टोरेज में ईवेंट कैसे बांधूं?

$(window).bind('storage', function(e) 
{ 
    alert('change'); 
}); 

localStorage.setItem('someItem', 'someValue'); 

अगर मैं sessionStorage उपयोग करते हैं, घटना नहीं आग:

$(window).bind('storage', function(e) 
{ 
    alert('change'); 
}); 

sessionStorage.setItem('someItem', 'someValue'); 

क्यों है?

+0

कौन सा ब्राउज़र? –

+0

मैं क्रोम में इसका परीक्षण कर रहा हूं। इसे क्रोम, एफएफ, और आईई 9 + में काम करना चाहिए। मुझे यह भी उल्लेख करना चाहिए कि मुझे किसी अन्य टैब/विंडो (उसी ब्राउज़र के) में आग लगने की आवश्यकता है। – Tesco

+1

मुझे यह नहीं लगता कि यह ईवेंट क्रोम में 'लोकल स्टोरेज' का उपयोग करके निकाल दिया गया है। –

उत्तर

10

यही वह तरीका है जो मुझे लगता है। spec से (जोर जोड़ा):

setItem(), removeItem(), और clear() तरीकों, पर है कि एक सत्र भंडारण क्षेत्र से संबंधित है जो एक Storage वस्तु एक्स कहा जाता है जब यदि तरीकों हर में, कुछ किया तो दस्तावेज़ वस्तु जिसका विंडो वस्तु की sessionStorage विशेषता के भंडारण वस्तु ही भंडारण क्षेत्र के साथ जुड़ा हुआ है, एक्स, एक भंडारण घटना

निकाल दिया जाना चाहिए के अलावा अन्य 210

I सोचें कि इसका मतलब यह है कि ईवेंट सत्र संग्रहण ऑब्जेक्ट को साझा करने वाले किसी भी अन्य दस्तावेज़ में निकाल दिया जाएगा, लेकिन दस्तावेज़ नहीं जिससे घटना को आग लग गई।

अद्यतन

यहाँ एक और very similar question जो मैं क्या ऊपर उल्लेख किया गया है (उत्तर कल्पना से ही पैरा उद्धरण) के साथ सहमत करने लगता है।

+0

मैं चाहता हूं कि ईवेंट किसी अन्य टैब/विंडो ("x के अलावा") में आग लग जाए। क्या सत्रस्टोर केवल वर्तमान विंडो/टैब पर लागू होता है? – Tesco

+0

नहीं, यह सत्र पर लागू होता है। ईवेंट * अन्य टैब/विंडोज़ में आग लगाना चाहिए, लेकिन यह उसी दस्तावेज़ में * नहीं * आग लगाना चाहिए। –

+0

क्या ईवेंट को उसी विंडो में आग लगाना संभव है? – user3281466

12

sessionStorage प्रत्येक टैब के लिए अलग है, इसलिए वे संवाद नहीं कर सकते हैं। sessionStorage के लिए ईवेंट केवल उसी टैब पर फ़्रेम के बीच ट्रिगर किए जाते हैं।

संपादित करें:

मैं निम्न उदाहरण दिया है:

http://codepen.io/surdu/pen/QGZGLO?editors=1010

उदाहरण पृष्ठ दो बटन है कि एक स्थानीय और एक सत्र भंडारण परिवर्तन को गति प्रदान की है।

यह भी एक और codepen कि भंडारण की घटनाओं परिवर्तनों को सुनता के लिए एक iframe एम्बेड करता है: (। आप इस एक अलग टैब में खोला रखना चाहिए)

http://codepen.io/surdu/pen/GNYNrW?editors=1010

आप देखेंगे कि जब आप प्रेस "स्थानीय लिखें" बटन, आईफ्रेम और खोले गए टैब दोनों में ईवेंट कैप्चर किया जाता है, लेकिन जब आप "सत्र लिखना" दबाते हैं तो केवल एम्बेडेड आईफ्रेम ईवेंट को कैप्चर करता है।

+2

यह गलत है .. –

+0

@TraianTatic मैंने एक उदाहरण के साथ जवाब अद्यतन किया है। क्या आप कृपया समझने में हमारी सहायता कर सकते हैं कि जवाब गलत क्यों है? धन्यवाद! –

+0

मैं @NicolaeSurdu से सहमत हूं। मुझे कई टैब और स्टोरेज स्टोरेज में स्टोरेजएवेंट के माध्यम से संपत्ति अपडेट ट्रैक करने की आवश्यकता थी। जब मैंने स्थानीय स्टोरेज इंस्टेंस का उपयोग करने के लिए स्विच किया तो स्टोरेजएवेंट अपेक्षित के रूप में निकाल दिया गया। स्थानीय स्टोरेज के माध्यम से संग्रहीत गुण लगातार होते हैं, इसलिए जब आप उनका उपयोग कर रहे होते हैं तो आपको उन्हें मैन्युअल रूप से संग्रहण से हटा देना होगा। –

2

इस प्रश्न को कुछ विचार मिल रहे हैं, इसलिए मैं इसे अतिरिक्त जानकारी के रूप में पोस्ट करूंगा।

मामले में आप sessionStorage वस्तु के बारे में अपडेट करने के लिए विशेष रूप से प्रतिक्रिया करने के लिए चाहते हैं, तो आप सिर्फ localStorage की वजह से घटनाओं को अनदेखा कर सकते हैं:

$(window).on('storage',function(e){ 
    if(e.originalEvent.storageArea===sessionStorage){ 
    alert('change'); 
    } 
    // else, event is caused by an update to localStorage, ignore it 
}); 

मैं jQuery नफरत है, तो के रूप में अच्छी तरह से एक देशी संस्करण पोस्ट करेंगे:

window.addEventListener('storage',function(e){ 
    if(e.storageArea===sessionStorage){ 
    alert('change'); 
    } 
    // else, event is caused by an update to localStorage, ignore it 
}); 
संबंधित मुद्दे