2012-10-09 13 views
9

हमारे उपयोगकर्ताओं में से एक से एक शिकायत के बाद और चल कुछ परीक्षण यह फ़ायरफ़ॉक्स 15 और 16 (और शायद पुराने संस्करण) प्रकट होता है यह इसलिए यदि आप कुकीज़ को अक्षम आप भी को निष्क्रिय कर स्थानीय भंडार। तुम भी जब भी आप window.localStorage आप Error: The operation is insecure.समाधान कुकीज़ और इस तरह localStorage अक्षम करने - polyfill संभव नहीं

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

try{ 
     window.localStorage; 
}catch(err){ 
     window.localStorage = { 
       getItem: function(k){ 
        return this.k; 
       }, 
       setItem: function(k,v){ 
        this.k = v; 
       } 
     }; 
} 

एकमात्र समाधान अन्य चर "नकली" localStorage लिए कदम प्रतीत हो रहा है, लेकिन यह होगा परेशान होना क्योंकि हमारे पास बहुत सारे कोड हैं और एक जेएस lib है जो इस चर को एक्सेस करने पर भरोसा करता है। कोई समाधान?

संपादित करें: कुकीज़ को आवश्यक उपयोगकर्ताओं को बताने के लिए केवल एक चेतावनी पॉप अप करना इष्टतम नहीं है। यदि आगंतुक सिर्फ साइट देखना चाहते हैं और साइनअप नहीं करना चाहते हैं तो उन्हें वास्तव में कुकीज़ की आवश्यकता नहीं है। लेकिन एक backbone.js आवेदन किया जा रहा है और डेटा का एक बहुत चारों ओर गुजर, हम दुकान सामान localStorage में काफ़ी है।

+3

यदि आप यह जांच सकते हैं कि यह अक्षम है या नहीं, तो बस एक चेतावनी या कुछ बताएं कि उन्हें आपकी साइट के लिए कुकीज़ सक्षम करने की आवश्यकता है। – MrOBrian

+0

धन्यवाद श्री ओब्रियन, मैंने ऐसा किया और संदेश के साथ एक div इंजेक्शन कर रहा हूं लेकिन स्थानीय स्टोरेज के लिए केवल एक कुंजी/वैल्यू स्टोर के रूप में काम करने के लिए इष्टतम होगा जो कि जारी नहीं रहा था, क्योंकि उपयोगकर्ता यही चाहता है। –

+0

"लेकिन स्थानीय स्टोरेज के लिए केवल एक कुंजी/वैल्यू स्टोर के रूप में काम करने के लिए इष्टतम होगा जो" "जारी नहीं रहेगा, इस मामले में केवल एक साधारण जेएस सरणी का उपयोग क्यों न करें? –

उत्तर

0

हम स्थानीय संग्रहण के लिए हमारे lib के रूप में इस का उपयोग करें।

(function (window, $, undefined) { 
    var store = window.store = {}; 

    function deserialize(val) { 
     if (!val) return null; 
     var obj = $.parseJSON(val); 
     return obj; 
    }; 

    function processRequest(loc, key, value) { 
     var obj; 
     // if value is not specified at all assume we are doing a get. 
     if (value === undefined) { 
      // GET 
      obj = loc.getItem(key); 
      return deserialize(value); 
     } else { 
      // SET 
      loc.setItem(key, JSON.stringify(value)); 
     } 
    } 

    store.Local = function(key, value) { 
     return processRequest(window.localStorage, key, value); 
    }; 

    store.Session = function(key, value) { 
     return processRequest(window.sessionStorage, key, value); 
    }; 
} (window, jQuery)); 

आप आसानी से एक गैर-निरंतर सरणी पर फ़ॉलबैक के लिए कुछ परीक्षण कोड जोड़ सकते हैं।

+0

इस समाधान के साथ समस्या यह है कि आपको मूल लोकल स्टोरेज – DeMeNteD

1

localStorage के बाद से एक आरक्षित चर रहा है, तो आप एक अलग नाम के साथ एक आवरण का उपयोग कर के अलावा कोई अन्य समझदार विकल्प होता है। इस चर के तहत अपने स्वयं के कोड और वास्तविक localStorage लपेटें और अपने आवरण के नाम के साथ localStorage बदलें। परेशान, लेकिन परिवर्तन खोने से कम परेशान।

1

आपके पास दो विकल्प:

1) शाब्दिक scoping का लाभ उठाएं और कैसे लुकअप कार्य ... उदाहरण के लिए, अपने कोड को बंद करने में चल रहा है, तो वह बंद के अंदर आप निम्नलिखित चला सकते हैं:

var localStorage = window.localStorage || {... polyfill here...}; 

फिर अपने कोड के भीतर पूरी तरह से योग्य विंडो के बजाय स्थानीय स्टोरेज का उपयोग करें। लॉकस्ट स्टोरेज। लाभ यहाँ अभी जिस तरह शाब्दिक चर लुकअप कार्य यह वैश्विक के बजाय अपना अधिक "निकट" scoped संस्करण मिलेगा है। पीएस ... आपको शायद किसी भी तरह बंद होने में चलना चाहिए, इसलिए यह संभव होना चाहिए।

2) केवल परिवर्तनीय नाम बदलें, विक्रेता उपसर्ग को हटाने के लिए लोग क्या करते हैं इसके विपरीत।

window.pLocalStorage = window.localStorage || {... polyfill here...}; 

तो बस localStorage के बजाय pLocalStorage का उपयोग करने के लिए अपना कोड बदलें ... अपने ब्राउज़र इसका समर्थन करता है, तो यह देशी, अन्यथा polyfill का प्रयोग करेंगे।

+0

निक सेट करने के लिए इसका उपयोग करना होगा, वास्तविक प्रश्न में मैंने जो मुद्दा लिखा है उसे पुन: स्थापित करने के लिए निक: "आप यहां तक ​​कि निर्माण भी नहीं कर सकते जब भी आप window.localStorage तक पहुंचने का प्रयास करते हैं, तब तक इसके लिए एक पॉलीफिल आपको त्रुटि मिलती है: ऑपरेशन असुरक्षित है। " यदि आप कुकीज़ अक्षम करते हैं तो आप जेएस त्रुटि फेंकने के बिना इस चर को भी संदर्भित नहीं कर सकते हैं। –

+0

मॉविस ... मैक संस्करण पर उस त्रुटि को पाठ रूप से प्राप्त नहीं हो सका। उस ने कहा कि दूसरा विकल्प आपके प्रश्न में आपके द्वारा किए गए प्रयास को पकड़ने के साथ अच्छी तरह से खेलने के लिए कुछ मोड के साथ काम करेगा ... कोशिश करें { window.pLocalStorage = window.localStorage; } पकड़ें (गलती) { window.pLocalStorage = { getItem: फ़ंक्शन (के) { यह वापस करें .k; }, सेट इटैम: फ़ंक्शन (के, वी) { this.k = v; } }; } –

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