এইচটিএমএল 5 সাফারির সাথে স্থানীয় স্টোরেজ ত্রুটি: "কোটা_এক্সসিএইইডিইডিআরআর: ডোম ব্যতিক্রম 22: কোটা ছাড়িয়ে যাওয়া স্টোরেজে এমন কিছু যুক্ত করার চেষ্টা করা হয়েছিল।"


133

আইওএস সাফারি ব্যক্তিগত ব্রাউজিংয়ে আমার ওয়েব অ্যাপ্লিকেশনটিতে জাভাস্ক্রিপ্ট ত্রুটি রয়েছে:

জাভাস্ক্রিপ্ট: ERROR

অনির্দিষ্ট

QUOTA_EXCEEDED_ERR: DOM ব্যতিক্রম 22: স্টোরেজে কিছু যুক্ত করার চেষ্টা করা হয়েছিল ...

আমার কোড:

localStorage.setItem('test',1)

এই নির্দিষ্ট সমস্যাটির জন্য পরীক্ষা করে এমন একটি বৈশিষ্ট্য সনাক্ত করুন । তাহলে সঞ্চয়স্থান উপলব্ধ নেই, সঙ্গে localStorage shimming বিবেচনা memoryStorageদাবি অস্বীকার: আমি সংযুক্ত প্যাকেজগুলির লেখক
স্টিজন ডি উইট

4
হাই লোকেরা, আমি সাফারিড্রাইভার বজায় রাখতে সহায়তা করি। এই সমস্যাটি ওয়েবকিতের একটি দীর্ঘস্থায়ী বাগ যা সম্প্রতি স্থির করা হয়েছিল। স্থানীয় স্টোরেজ এবং সেশন স্টোরেজটি এখন সাফারি 10.1 এবং তারপরে কাজ করে। এই ফিক্সটি সাধারণ বেসরকারী ব্রাউজিং মোড এবং অটোমেশন মোডকে (ওয়েবড্রাইভার দ্বারা ব্যবহৃত) প্রভাবিত করে।
ব্রায়ান বার্গ

উত্তর:


183

স্পষ্টতই এটি নকশা দ্বারা। যখন সাফারি (ওএস এক্স বা আইওএস) ব্যক্তিগত ব্রাউজিং মোডে থাকে তখন এটি উপস্থিত হিসাবে উপস্থিত হয় তবে localStorageএটি কল করার চেষ্টা করে setItemব্যতিক্রম হয়।

store.js line 73
"QUOTA_EXCEEDED_ERR: DOM Exception 22: An attempt was made to add something to storage that exceeded the quota."

যা ঘটে তা হ'ল উইন্ডো অবজেক্টটি এখনও localStorageবিশ্বব্যাপী নেমস্পেসে প্রকাশ করে তবে আপনি যখন কল করবেন তখন setItemএই ব্যতিক্রম নিক্ষেপ করা হবে। যে কোনও কল removeItemউপেক্ষা করা হবে।

আমি বিশ্বাস করি যে সবচেয়ে সহজ ফিক্স (যদিও আমি এখনও এই ক্রস ব্রাউজারটি পরীক্ষা করে দেখিনি) isLocalStorageNameSupported()পরীক্ষাটি পরিবর্তন করতে হবে যাতে আপনি কিছু মানও নির্ধারণ করতে পারেন।

https://github.com/marcuswestin/store.js/issues/42

function isLocalStorageNameSupported() 
{
    var testKey = 'test', storage = window.sessionStorage;
    try 
    {
        storage.setItem(testKey, '1');
        storage.removeItem(testKey);
        return localStorageName in win && win[localStorageName];
    } 
    catch (error) 
    {
        return false;
    }
}

1
এটি অগত্যা ছদ্মবেশী মোডের কারণে হওয়া উচিত নয় ... যদিও আমি অনুমান করি যে ওপি বেশ কয়েকটি মেগাবাইট ডেটা সংরক্ষণ করতে চায় নি;)
ক্রিস্টোফ

5
পল আইরিশ দ্বারা স্থানীয় স্টোরেজ শনাক্ত করার সংক্ষিপ্ত ইতিহাস দেখিয়ে এই সংক্ষেপটি দেখুন ।
মটিটি

4
সুতরাং যে ক্ষেত্রে লোকালস্টোরেশন সাফারি তে কাজ করবে না, কুকিজের মধ্যে সবকিছুই পরের সেরা বিকল্পটি সংরক্ষণ করছে?
উইল হিচকক

5
পল আইরিশ উদাহরণ অনুরূপ, আমি পরিবর্তন করার পরামর্শ দিই return localStorageName in win && win[localStorageName];করতে return true। তারপরে আপনার একটি ফাংশন রয়েছে যা লোকালস্টোরেশনের উপলব্ধতার উপর নির্ভর করে নিরাপদে সত্য বা মিথ্যা ফিরিয়ে দেয়। উদাহরণস্বরূপ:if (isLocalStorageNameSupported()) { /* You can use localStorage.setItem */ } else { /* you can't use localStorage.setItem */ }
ড্রুয়েট

1
যাচাই করা হয়েছে যে বিষয়টি কেবলমাত্র ব্যক্তিগত উইন্ডো নয়, সাধারণ সাফারি উইন্ডোতেও রয়েছে।
কোডমারির

38

উপরের লিঙ্কে পোস্ট করা ফিক্সটি আমার পক্ষে কার্যকর হয়নি। এটি করেছে:

function isLocalStorageNameSupported() {
  var testKey = 'test', storage = window.localStorage;
  try {
    storage.setItem(testKey, '1');
    storage.removeItem(testKey);
    return true;
  } catch (error) {
    return false;
  }
}

Http://m.cg/post/13095478393/detect-private-browsing-mode-in-momot-safari-on-ios5 থেকে উত্পন্ন


20
আপনি (এবং @ কিংকংফ্রাগ) কোনও নির্দিষ্ট কারণে আপনি লোকালস্টোরায় লিখতে পারেন কিনা তা সনাক্ত করতে উইন্ডো.সেসিয়েন্স স্টোরেজ ব্যবহার করছেন বা আমরা কোনও অদ্ভুত অনুলিপি-পেস্ট টাইপো চক্রের মধ্যে আছি?
তবুও 21

@ ইয়েতি যদি আপনি একটি টাইপো লক্ষ্য করে থাকেন তবে আপনি এটি সম্পাদনা বা আপনার মন্তব্যে কেন সংশোধন করেন না? আমি যতদূর সচেতন window.sessionStorageতাই সঠিক। এটি অবশ্যই আমার কোডে কাজ করে। দয়া করে আসলে বাতলান ফিক্স সমস্যা আপনার সম্পর্কে জানতে প্রদর্শিত।
নভোচেন

7
@ নভোচেন আমার মন্তব্যটি ইঙ্গিত করছিল যে তারা লোকালস্টোরেজ সমর্থন পরীক্ষা করার জন্য বিদ্যমান একটি ফাংশনে সেশনস্টোরেজ ব্যবহার করছে। হ্যাঁ, এটি সম্ভবত এখনও কাজ করবে তবে লিখিত হিসাবে ফাংশনটির নাম আসলে যা পরীক্ষা করা হচ্ছে তার জন্য বিভ্রান্ত করছে। আমি সম্পাদনা করার পরিবর্তে মন্তব্য করা বেছে নিয়েছি কারণ আমি ভেবেছিলাম যে আমি কিছু অনুপস্থিত এবং এই লোকদের কাছ থেকে শিখতে আশা করি। দুর্ভাগ্যক্রমে, তারা জবাব দেয়নি বা কোনও সংশোধন করেনি তাই আমরা এখানে আছি।
তবুও 17

3
@ ইয়েতি পরিষ্কার করার জন্য আপনাকে ধন্যবাদ। আমি এখন আপনি কি সম্পর্কে ছিল দেখতে। ; -]
নভোচেন

2
@ ডসনসটাহ এটি ছিল না কারণ আমি ফাংশনটি ডেকেছিলাম isLocalStorageNameSupportedএবং পরীক্ষা করছিলাম window.sessionStorage। একই পরিণতি কিন্তু একটি বিভ্রান্তিকর ছিল। উত্তরটি পরিষ্কার করার জন্য সম্পাদনা করা হয়েছিল।
সাইবারওয়াম্ব্যাট

25

অন্যান্য উত্তরে যেমন উল্লেখ করা হয়েছে, আপনি সর্বদা সাফারি প্রাইভেট ব্রাউজার মোডে কোটাএক্সসিডেড এরিয়ারটি আইওএস এবং ওএস এক্স উভয়ই localStorage.setItem(বা sessionStorage.setItem) বলা হলে পাবেন।

একটি সমাধান হ'ল ব্যবহারের প্রতিটি ক্ষেত্রে চেষ্টা / ধরা বা মডার্নজার চেক করা setItem

তবে আপনি যদি এমন কোনও শিম চান যা বিশ্বব্যাপী এই ত্রুটিটি ছড়িয়ে দেওয়া বন্ধ করে দেয়, যাতে আপনার বাকী জাভাস্ক্রিপ্টটি ভেঙে ফেলা যায়, আপনি এটি ব্যবহার করতে পারেন:

https://gist.github.com/philfreo/68ea3cd980d72383c951

// Safari, in Private Browsing Mode, looks like it supports localStorage but all calls to setItem
// throw QuotaExceededError. We're going to detect this and just silently drop any calls to setItem
// to avoid the entire page breaking, without having to do a check at each usage of Storage.
if (typeof localStorage === 'object') {
    try {
        localStorage.setItem('localStorage', 1);
        localStorage.removeItem('localStorage');
    } catch (e) {
        Storage.prototype._setItem = Storage.prototype.setItem;
        Storage.prototype.setItem = function() {};
        alert('Your web browser does not support storing settings locally. In Safari, the most common cause of this is using "Private Browsing Mode". Some settings may not save or some features may not work properly for you.');
    }
}

11

আমার প্রসঙ্গে, সবেমাত্র একটি শ্রেণীর বিমূর্ততা তৈরি হয়েছে। যখন আমার অ্যাপ্লিকেশন চালু হয়, আমি গেটস্প্রেজ () কল করে লোকালস্টোরেশন কাজ করছে কিনা তা পরীক্ষা করে দেখি । এই ফাংশনটিও ফিরে আসে:

  • লোকালস্টোরাজ যদি কাজ করে তবে লোকালস্টোরেশন
  • বা কাস্টম শ্রেণীর লোকালস্টোরএজ বিকল্পের একটি বাস্তবায়ন

আমার কোডে আমি কখনই লোকালস্টোরেজকে সরাসরি কল করি না। আমি cusSto গ্লোবাল ভার কল , আমি getStorage () কল করে সূচনা করেছি ।

এইভাবে, এটি ব্যক্তিগত ব্রাউজিং বা নির্দিষ্ট সাফারি সংস্করণগুলির সাথে কাজ করে

function getStorage() {

    var storageImpl;

     try { 
        localStorage.setItem("storage", ""); 
        localStorage.removeItem("storage");
        storageImpl = localStorage;
     }
     catch (err) { 
         storageImpl = new LocalStorageAlternative();
     }

    return storageImpl;

}

function LocalStorageAlternative() {

    var structureLocalStorage = {};

    this.setItem = function (key, value) {
        structureLocalStorage[key] = value;
    }

    this.getItem = function (key) {
        if(typeof structureLocalStorage[key] != 'undefined' ) {
            return structureLocalStorage[key];
        }
        else {
            return null;
        }
    }

    this.removeItem = function (key) {
        structureLocalStorage[key] = undefined;
    }
}

cusSto = getStorage();

2
ধন্যবাদ পিয়েরে, আপনার উত্তর আমাকে অনুপ্রাণিত করেছে। মেমরিস্টোরেজ নামে একটি দুর্দান্ত মডিউলে আমি এটি প্যাকেজিং শেষ করেছি । অবশ্যই ওপেন সোর্স। একই সমস্যাযুক্ত অন্যান্য ব্যক্তিদের জন্য এটি পরীক্ষা করে দেখুন এটি আপনাকে সাহায্য করতে পারে।
স্টিজন ডি উইট

হা। আমিও একই কাজ করেছি (স্বতন্ত্রভাবে)। তবুও লোকালস্টোরেজ ভেরিয়েবলটি ব্যবহার করুন (সাফারিতে, কমপক্ষে, আপনি লোকালস্টোরেজ ভেরিয়েবলটি ওভাররাইট করতে পারবেন না (এটি কেবল 'পঠনযোগ্য'), তবে আপনি সেটআইটেম / রিলিজ আইটেম / গেইট আইটেমটি পুনরায় স্বাক্ষর করতে পারেন)।
রুবেন মার্টিনেজ জুনিয়র

@ স্টিজেডেভিট, অন্য পৃষ্ঠাগুলিতে আমি কীভাবে আমার স্টোরেজ মানগুলি অ্যাক্সেস করতে পারি? উদাহরণস্বরূপ, আমার এটিকে আমার হেলপারে রয়েছে ph php var store = মেমরিস্টোরেজ ('মাই-অ্যাপ'); store.setItem ('মাইস্ট্রিং', 'হ্যালো মেমোরিস্টোরেজ!'); আমি লেকচার.পিএফ-তে আমার স্ট্রিংয়ের মানটি অ্যাক্সেস করতে চাই। আমি পৃষ্ঠাটিতে মেমরি স্টোরেজ শুরু করার চেষ্টা করেছি তবে এটি খালি অবজেক্টটি দেখায়।
ব্যবহারকারী 1149244

@ user1149244 মেমরিস্টোরেজ পৃষ্ঠায় স্থানীয়। এটি ওয়েব স্টোরেজ এপিআই অনুকরণ করে এবং যখন লোকালস্টোরেজ এবং সেশন স্টোরেজ উপলব্ধ না থাকে তখন ফ্যালব্যাক হিসাবে ব্যবহার করা যেতে পারে। তবে ডেটা কেবল পৃষ্ঠা মেমোরিতে (তাই নাম) ধরে রাখা হবে। আপনার যদি পৃষ্ঠাগুলি জুড়ে ডেটা ধরে রাখতে প্রয়োজন হয় তবে কুকিজ আপনাকে সহায়তা করতে পারে। তবে এটি সংরক্ষণ করা যায় এমন পরিমাণের পরিমাণে খুব সীমিত। তা ছাড়া তেমন কিছুই করা যায় না।
স্টিজন ডি উইট

2
@ user1149244 এটি কি ব্রাউজারে মানগুলি মনে করা যায় না? না, এটা পারে না। এক পৃষ্ঠা থেকে অন্য পৃষ্ঠায় রিফ্রেশ করে স্টাফ ক্লায়েন্টের পাশের 3 টি উপায় রয়েছে: কুকিজ, সেশনসোজার / লোকালস্টোরেজ এবং সূচক ডিবি D শেষ দুটি তুলনামূলকভাবে নতুন। সেশনসটোরেশন এবং লোকালস্টোরেজ বিস্তৃতভাবে সমর্থিত তাই আপনি এটি যেকোন জায়গায় মূলত ব্যবহার করতে পারেন। ব্যক্তিগত ব্রাউজিং মোড ব্যতীত , যা এই সমস্যাটি সম্পর্কে। প্রোগ্রামগুলি ভেঙে যায় কারণ সঞ্চয়স্থান ছিল না। মেমরি স্টোরেজ কেবলমাত্র একটি ফ্যালব্যাক সরবরাহ করে যা পৃষ্ঠায় থাকাকালীন সর্বদা কাজ করে তবে এটি আসলে ডেটা সংরক্ষণ করতে পারে না। এটা একগুঁয়ে তবে কোনও ত্রুটি নেই।
স্টিজন ডি উইট

5

দেখে মনে হচ্ছে সাফারি 11 আচরণটি পরিবর্তন করে এবং এখন স্থানীয় স্টোরেজটি একটি ব্যক্তিগত ব্রাউজার উইন্ডোতে কাজ করে। হুররে!

আমাদের ওয়েব অ্যাপ্লিকেশন যা সাফারি ব্যক্তিগত ব্রাউজিংয়ে ব্যর্থ হয়েছিল এখন নির্দোষভাবে কাজ করে। এটি ক্রোমের ব্যক্তিগত ব্রাউজিং মোডে সর্বদা সূক্ষ্মভাবে কাজ করেছিল, যা সর্বদা স্থানীয় স্টোরেজে লেখার অনুমতি দেয়।

এটি অ্যাপলের সাফারি প্রযুক্তি পূর্বরূপ রিলিজ নোটগুলিতে - এবং ওয়েবকিট রিলিজ নোটগুলি - 29 টি মুক্তি পাওয়ার জন্য, যা মে 2017 এ ছিল docu

বিশেষ করে:

  • স্থানীয় ব্রাউজিং মোডে বা ওয়েবড্রাইভার সেশনে লোকালস্টোরারে সঞ্চয় করার সময় স্থির কোটাএক্সসিডেড এরির - r215315

4

অন্যের উত্তরগুলিকে প্রসারিত করার জন্য, এখানে একটি কমপ্যাক্ট সমাধান দেওয়া হয়েছে যা কোনও নতুন ভেরিয়েবলগুলি প্রকাশ / যুক্ত করে না। এটি সমস্ত ঘাঁটি কভার করে না, তবে এটি এমন বেশিরভাগ লোকের পক্ষে উচিত যারা কেবলমাত্র একটি একক পৃষ্ঠার অ্যাপ্লিকেশনটি কার্যকর রাখতে চান (পুনরায় লোডের পরে কোনও ডেটা জেদ থাকা সত্ত্বেও)।

(function(){
    try {
        localStorage.setItem('_storage_test', 'test');
        localStorage.removeItem('_storage_test');
    } catch (exc){
        var tmp_storage = {};
        var p = '__unique__';  // Prefix all keys to avoid matching built-ins
        Storage.prototype.setItem = function(k, v){
            tmp_storage[p + k] = v;
        };
        Storage.prototype.getItem = function(k){
            return tmp_storage[p + k] === undefined ? null : tmp_storage[p + k];
        };
        Storage.prototype.removeItem = function(k){
            delete tmp_storage[p + k];
        };
        Storage.prototype.clear = function(){
            tmp_storage = {};
        };
    }
})();

3

আয়নিক কাঠামো (অ্যাঙ্গুলার + কর্ডোভা) ব্যবহার করে আমার একই সমস্যা হয়েছিল। আমি জানি এটি সমস্যার সমাধান করে না, তবে এটি উপরের উত্তরের উপর ভিত্তি করে অ্যাংুলার অ্যাপসের কোড। আপনার কাছে সাফারির আইওএস সংস্করণে লোকালস্টোরের জন্য একটি সাময়িক সমাধান হবে।

কোডটি এখানে:

angular.module('myApp.factories', [])
.factory('$fakeStorage', [
    function(){
        function FakeStorage() {};
        FakeStorage.prototype.setItem = function (key, value) {
            this[key] = value;
        };
        FakeStorage.prototype.getItem = function (key) {
            return typeof this[key] == 'undefined' ? null : this[key];
        }
        FakeStorage.prototype.removeItem = function (key) {
            this[key] = undefined;
        };
        FakeStorage.prototype.clear = function(){
            for (var key in this) {
                if( this.hasOwnProperty(key) )
                {
                    this.removeItem(key);
                }
            }
        };
        FakeStorage.prototype.key = function(index){
            return Object.keys(this)[index];
        };
        return new FakeStorage();
    }
])
.factory('$localstorage', [
    '$window', '$fakeStorage',
    function($window, $fakeStorage) {
        function isStorageSupported(storageName) 
        {
            var testKey = 'test',
                storage = $window[storageName];
            try
            {
                storage.setItem(testKey, '1');
                storage.removeItem(testKey);
                return true;
            } 
            catch (error) 
            {
                return false;
            }
        }
        var storage = isStorageSupported('localStorage') ? $window.localStorage : $fakeStorage;
        return {
            set: function(key, value) {
                storage.setItem(key, value);
            },
            get: function(key, defaultValue) {
                return storage.getItem(key) || defaultValue;
            },
            setObject: function(key, value) {
                storage.setItem(key, JSON.stringify(value));
            },
            getObject: function(key) {
                return JSON.parse(storage.getItem(key) || '{}');
            },
            remove: function(key){
                storage.removeItem(key);
            },
            clear: function() {
                storage.clear();
            },
            key: function(index){
                storage.key(index);
            }
        }
    }
]);

সূত্র: https://gist.github.com/jorgecasar/61fda6590dc2bb17e871

আপনার কোডিং উপভোগ করুন!


1
যদিও এটি প্রশ্নের উত্তর দেয় না আমি এই প্রথম বিষয়টিটি প্রকাশ করেছি যখন আমি সমস্যাটি গুগল করেছিলাম। পরবর্তী পদক্ষেপটি ছিল কৌণিকের জন্য সমাধানটি অনুসন্ধান করা তবে এই মন্তব্যের জন্য আমাকে অন্য কোথাও যেতে হবে না। সুতরাং, সরাসরি প্রশ্নের উত্তর নাও দিতে পারে তবে এটি আমার পক্ষে দুর্দান্ত এবং সম্ভবত অন্যদের পক্ষেও দুর্দান্ত!
লিওনার্ড

2

আইংএফই ব্যবহার করে এবং পরিষেবাগুলি একাঞ্চলীয় এই বিষয়টির সদ্ব্যবহার করার জন্য এখানে AngularJS এর ​​সমাধান রয়েছে

এই ফলাফল isLocalStorageAvailableসেট হওয়া অবিলম্বে যখন সেবা প্রথম ইনজেকশনের হয় এবং অযথা চেক প্রত্যেক সময় স্থানীয় সংগ্রহস্থল চাহিদা অ্যাক্সেস করা যেতে দৌড়ে এড়াতে।

angular.module('app.auth.services', []).service('Session', ['$log', '$window',
  function Session($log, $window) {
    var isLocalStorageAvailable = (function() {
      try {
        $window.localStorage.world = 'hello';
        delete $window.localStorage.world;
        return true;
      } catch (ex) {
        return false;
      }
    })();

    this.store = function(key, value) {
      if (isLocalStorageAvailable) {
        $window.localStorage[key] = value;
      } else {
        $log.warn('Local Storage is not available');
      }
    };
  }
]);

1

আমি অসমর্থিত বা অক্ষম ব্রাউজারগুলির বৈশিষ্ট্যগুলি সরবরাহ করতে এবং সবেমাত্র এই রেপো তৈরি করেছি ।sessionStoragelocalStorage

সমর্থিত ব্রাউজারগুলি

  • IE5 + +
  • সমস্ত সংস্করণ ক্রোম
  • মজিলা সমস্ত সংস্করণ
  • সমস্ত সংস্করণ ইয়ানডেক্স

কিভাবে এটা কাজ করে

এটি স্টোরেজ ধরণের সাথে বৈশিষ্ট্যটি সনাক্ত করে।

function(type) {
    var testKey = '__isSupported',
        storage = window[type];
    try {
        storage.setItem(testKey, '1');
        storage.removeItem(testKey);
        return true;
    } catch (error) {
        return false;
    }
};

সেট StorageService.localStorageথেকে window.localStorageযদি এটি সমর্থিত বা একটি কুকি স্টোরেজ তৈরি করে করা হয়। এটি সমর্থিত কিনা বা এসপিএর জন্য মেমরি স্টোরেজটিতে মেমরি স্টোরেজ তৈরি করা StorageService.sessionStorageহয় window.sessionStorageকিনা তা সেট করে, এসপিএর জন্য সিজন বৈশিষ্ট্য সহ কুকি সঞ্চয়স্থান।


1
ধন্যবাদ, আপনার গ্রন্থাগারটি অনেক সাহায্য করেছে!
ম্যাথিউ

1

এখানে মেমরি স্টোরেজ বিকল্পের জন্য একটি কৌণিক 2 + পরিষেবা সংস্করণ রয়েছে, আপনি পিয়েরে লে রাউক্সের উত্তরের উপর ভিত্তি করে কেবলমাত্র আপনার উপাদানগুলিতে ইনজেক্ট করতে পারেন।

import { Injectable } from '@angular/core';

// Alternative to localstorage, memory
// storage for certain browsers in private mode
export class LocalStorageAlternative {
    private  structureLocalStorage = {};

    setItem(key: string, value: string): void {
        this.structureLocalStorage[key] = value;
    }

    getItem(key: string): string {
        if (typeof this.structureLocalStorage[key] !== 'undefined' ) {
            return this.structureLocalStorage[key];
        }
        return null;
    }

    removeItem(key: string): void {
        this.structureLocalStorage[key] = undefined;
    }
}

@Injectable()
export class StorageService {
    private storageEngine;

    constructor() {
        try {
            localStorage.setItem('storage_test', '');
            localStorage.removeItem('storage_test');
            this.storageEngine = localStorage;
        } catch (err) {
            this.storageEngine = new LocalStorageAlternative();
        }
    }

    setItem(key: string, value: string): void {
        this.storageEngine.setItem(key, value);
    }

    getItem(key: string): string {
        return this.storageEngine.getItem(key);
    }

    removeItem(key: string): void {
        this.storageEngine.removeItem(key);
    }

}

0

সমর্থিত না হলে এটি ব্যবহার করবেন না এবং সমর্থন পরীক্ষা করতে কেবল এই ফাংশনটি কল করুন

Es6 এ সম্পূর্ণরূপে ভাগ করে নেওয়া লোকালস্টোরেজ উদাহরণ এবং সমর্থন চেক সহ লিখুন

const LOCAL_STORAGE_KEY = 'tds_app_localdata';

const isSupported = () => {
  try {
    localStorage.setItem('supported', '1');
    localStorage.removeItem('supported');
    return true;
  } catch (error) {
    return false;
  }
};


const writeToLocalStorage =
  components =>
    (isSupported ?
      localStorage.setItem(LOCAL_STORAGE_KEY, JSON.stringify(components))
      : components);

const isEmpty = component => (!component || Object.keys(component).length === 0);

const readFromLocalStorage =
  () => (isSupported ? JSON.parse(localStorage.getItem(LOCAL_STORAGE_KEY)) || {} : null);

এটি আপনার ব্রাউজারগুলিতে আপনার কীগুলি সেট এবং সঠিকভাবে পুনরুদ্ধার করা হবে তা নিশ্চিত করবে।


0

আমি ইস্যুটির জন্য একটি প্যাচ তৈরি করেছি। কেবলমাত্র আমি যাচাই করে দেখছি যে ব্রাউজারটি লোকাল স্টোরেজ বা সেশন স্টোরেজ সমর্থন করে কিনা। তা না হলে স্টোরেজ ইঞ্জিনটি কুকি হবে। তবে নেতিবাচক দিকটি হ'ল কুকির খুব ছোট স্টোরেজ মেমরি রয়েছে :(

function StorageEngine(engine) {
    this.engine = engine || 'localStorage';

    if(!this.checkStorageApi(this.engine)) {
        // Default engine would be alway cooke
        // Safari private browsing issue with localStorage / sessionStorage
        this.engine = 'cookie';
    }
}

StorageEngine.prototype.checkStorageApi = function(name) {
    if(!window[name]) return false;
    try {
        var tempKey = '__temp_'+Date.now();
        window[name].setItem(tempKey, 'hi')
        window[name].removeItem(tempKey);
        return true;
    } catch(e) {
        return false;
    }
}

StorageEngine.prototype.getItem = function(key) {
    if(['sessionStorage', 'localStorage'].includes(this.engine)) {
        return window[this.engine].getItem(key);
    } else if('cookie') {
        var name = key+"=";
        var allCookie = decodeURIComponent(document.cookie).split(';');
        var cval = [];
        for(var i=0; i < allCookie.length; i++) {
            if (allCookie[i].trim().indexOf(name) == 0) {
                cval = allCookie[i].trim().split("=");
            }   
        }
        return (cval.length > 0) ? cval[1] : null;
    }
    return null;
}

StorageEngine.prototype.setItem = function(key, val, exdays) {
    if(['sessionStorage', 'localStorage'].includes(this.engine)) {
        window[this.engine].setItem(key, val);
    } else if('cookie') {
        var d = new Date();
        var exdays = exdays || 1;
        d.setTime(d.getTime() + (exdays*24*36E5));
        var expires = "expires="+ d.toUTCString();
        document.cookie = key + "=" + val + ";" + expires + ";path=/";
    }
    return true;
}


// ------------------------
var StorageEngine = new StorageEngine(); // new StorageEngine('localStorage');
// If your current browser (IOS safary or any) does not support localStorage/sessionStorage, then the default engine will be "cookie"

StorageEngine.setItem('keyName', 'val')

var expireDay = 1; // for cookie only
StorageEngine.setItem('keyName', 'val', expireDay)
StorageEngine.getItem('keyName')

0

গৃহীত উত্তর বেশ কয়েকটি পরিস্থিতিতে যথেষ্ট নয় বলে মনে হচ্ছে।

সমর্থিত localStorageবা sessionStorageসমর্থিত কিনা তা পরীক্ষা করতে আমি MDN থেকে নিম্নলিখিত স্নিপেট ব্যবহার করি ।

function storageAvailable(type) {
    var storage;
    try {
        storage = window[type];
        var x = '__storage_test__';
        storage.setItem(x, x);
        storage.removeItem(x);
        return true;
    }
    catch(e) {
        return e instanceof DOMException && (
            // everything except Firefox
            e.code === 22 ||
            // Firefox
            e.code === 1014 ||
            // test name field too, because code might not be present
            // everything except Firefox
            e.name === 'QuotaExceededError' ||
            // Firefox
            e.name === 'NS_ERROR_DOM_QUOTA_REACHED') &&
            // acknowledge QuotaExceededError only if there's something already stored
            (storage && storage.length !== 0);
    }
}

এই স্নিপেটটি এটির মতো ব্যবহার করুন এবং ফলব্যাক, উদাহরণস্বরূপ, কুকি ব্যবহার করে:

if (storageAvailable('localStorage')) {
  // Yippee! We can use localStorage awesomeness
}
else {
  // Too bad, no localStorage for us
  document.cookie = key + "=" + encodeURIComponent(value) + expires + "; path=/";
}

আমি ফ্যালব্যাকস্টোরেজ প্যাকেজ তৈরি করেছি যা ম্যানুয়ালি প্রয়োগ করা মেমোরি স্টোরেজে স্টোরেজ উপলভ্যতা এবং ফ্যালব্যাক যাচাই করতে এই স্নিপেট ব্যবহার করে।

import {getSafeStorage} from 'fallbackstorage'

getSafeStorage().setItem('test', '1') // always work

-1
var mod = 'test';
      try {
        sessionStorage.setItem(mod, mod);
        sessionStorage.removeItem(mod);
        return true;
      } catch (e) {
        return false;
      }

1
আপনি ব্যাখ্যা কয়েকটি শব্দ যুক্ত করতে চান?
বগল

-2

নিম্নলিখিত স্ক্রিপ্টটি আমার সমস্যার সমাধান করেছে:

// Fake localStorage implementation. 
// Mimics localStorage, including events. 
// It will work just like localStorage, except for the persistant storage part. 

var fakeLocalStorage = function() {
  var fakeLocalStorage = {};
  var storage; 

  // If Storage exists we modify it to write to our fakeLocalStorage object instead. 
  // If Storage does not exist we create an empty object. 
  if (window.Storage && window.localStorage) {
    storage = window.Storage.prototype; 
  } else {
    // We don't bother implementing a fake Storage object
    window.localStorage = {}; 
    storage = window.localStorage; 
  }

  // For older IE
  if (!window.location.origin) {
    window.location.origin = window.location.protocol + "//" + window.location.hostname + (window.location.port ? ':' + window.location.port: '');
  }

  var dispatchStorageEvent = function(key, newValue) {
    var oldValue = (key == null) ? null : storage.getItem(key); // `==` to match both null and undefined
    var url = location.href.substr(location.origin.length);
    var storageEvent = document.createEvent('StorageEvent'); // For IE, http://stackoverflow.com/a/25514935/1214183

    storageEvent.initStorageEvent('storage', false, false, key, oldValue, newValue, url, null);
    window.dispatchEvent(storageEvent);
  };

  storage.key = function(i) {
    var key = Object.keys(fakeLocalStorage)[i];
    return typeof key === 'string' ? key : null;
  };

  storage.getItem = function(key) {
    return typeof fakeLocalStorage[key] === 'string' ? fakeLocalStorage[key] : null;
  };

  storage.setItem = function(key, value) {
    dispatchStorageEvent(key, value);
    fakeLocalStorage[key] = String(value);
  };

  storage.removeItem = function(key) {
    dispatchStorageEvent(key, null);
    delete fakeLocalStorage[key];
  };

  storage.clear = function() {
    dispatchStorageEvent(null, null);
    fakeLocalStorage = {};
  };
};

// Example of how to use it
if (typeof window.localStorage === 'object') {
  // Safari will throw a fit if we try to use localStorage.setItem in private browsing mode. 
  try {
    localStorage.setItem('localStorageTest', 1);
    localStorage.removeItem('localStorageTest');
  } catch (e) {
    fakeLocalStorage();
  }
} else {
  // Use fake localStorage for any browser that does not support it.
  fakeLocalStorage();
}

এটি স্থানীয় স্টোরেজ উপস্থিত রয়েছে কিনা তা ব্যবহার করে এবং নেতিবাচক ক্ষেত্রে এটি একটি নকল স্থানীয় সঞ্চয়স্থান তৈরি করে এবং এটি স্থানীয় লোকাল স্টোরেজের পরিবর্তে ব্যবহার করে। আপনার আরও তথ্যের প্রয়োজন হলে আমাকে জানান।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.