Soru Tarayıcının HTML5 Yerel Depolama'yı destekleyip desteklemediği nasıl tespit edilir


Aşağıdaki kod uyarıları ls exist IE7'de:

if(window.localStorage) {
    alert('ls exists');
} else {
    alert('ls does not exist');
}

IE7 yerel depolama alanını gerçekten desteklemiyor, ancak bunu hala uyarıyor. Belki de IE9 tarayıcı aracında IE9 ve IE9 geliştirici aracını kullanarak belge modları kullanıyorum. Ya da belki de LS desteklenip desteklenmediğini test etmenin yanlış yolu budur. Doğru yol nedir?

Ayrıca, sadece birkaç HTML5 özelliğini kullandığımdan ve büyük bir betik yüklediğinden, sadece birkaç şey için destek bulmak için değmezken, Modernizr'i kullanmak istemiyorum.


76
2018-06-26 19:14


Menşei


Olası kopya HTML 5 localStorage için kontrol edin - BuZZ-dEE


Cevaplar:


Modernizr'i kullanmak zorunda değilsiniz, ancak eğer kendi localStorage desteklenir

github şirketinde modernizr
için test localStorage

// In FF4, if disabled, window.localStorage should === null.

// Normally, we could not test that directly and need to do a
//   `('localStorage' in window) && ` test first because otherwise Firefox will
//   throw bugzil.la/365772 if cookies are disabled

// Also in iOS5 & Safari Private Browsing mode, attempting to use localStorage.setItem
// will throw the exception:
//   QUOTA_EXCEEDED_ERRROR DOM Exception 22.
// Peculiarly, getItem and removeItem calls do not throw.

// Because we are forced to try/catch this, we'll go aggressive.

// Just FWIW: IE8 Compat mode supports these features completely:
//   www.quirksmode.org/dom/html5.html
// But IE8 doesn't support either with local files

Modernizr.addTest('localstorage', function() {
    var mod = 'modernizr';
    try {
        localStorage.setItem(mod, mod);
        localStorage.removeItem(mod);
        return true;
    } catch(e) {
        return false;
    }
});

mevcut kaynak koduyla güncellendi


88
2018-06-26 19:18



Eklemek var mod = "test"; try-catch bloğundan önce, mod burada tanımsız olduğu için bu her zaman başarısız olur. - Mahn
Haklısın. Kaynağı modernizrden kopyaladım ve doğruluğuna güvendim ... - Andreas
Yerlilerde boşluk kalmamışsa bu başarısız olabilir. - Patrick
@ O adam olmanın püf noktası ...: P - contactmatt
Dürüst olmak gerekirse, bu en iyi test değil, çünkü yerel depolama alanı doluysa ne olacak? localStorage desteklenebilir, ancak ekleyemeyeceğiniz bir durumda. - DemiImp


if(typeof Storage !== "undefined")
  {
  // Yes! localStorage and sessionStorage support!
  // Some code.....
  }
else
  {
  // Sorry! No web storage support..
  }

36
2018-06-26 19:15



typeof(Storage) !== void(0) daha iyi çözüm - Petja Touru
@petjato aslında olmalı if (Storage !== void(0)) - Andrew Anthony Gerst
typeof bir işlev değil, bir dil operatörü. neden parantez - r3wt
Bu W3Schools'ta bulunan şeyin küçük bir varyantı gibi görünüyor Web sitesi. Ayrıca işe yaramıyor. - fujiiface
Safari'deki gizli göz atma modu, localStorage'a yazmayı desteklemez, ancak bu onay bu durumda geçerli olur. Andreas'ın çözümü bu davayı ele alıyor. - Deepak Joy


Ayrıca ben sadece birkaç HTML5 kullanıyorum beri Modernizr kullanmak istemiyorum   özellikleri ve büyük bir betik yükleme sadece tespit etmek için değmez   Bu birkaç şey için destek.

Modernizr dosya boyutunu azaltmak için, dosyayı aşağıdaki adresten özelleştirin: http://modernizr.com/download/ ihtiyaçlarınızı karşılamak için. Modernizr'ın localStorage-only sürümü 1,55KB'de geliyor.


15
2018-04-01 14:16



Merhaba, Stack Overflow'a hoş geldiniz! Bu gerçekten olması gerektiği gibi geliyor yorum Yap bir değil Cevaporijinal soruya. Henüz yorum yapamayacağınızı, ancak 50'ye ulaştığınızı anlıyorum. temsilci zor ya da zaman alıcı değil. - Jesse
Bunu yapabilirsin - sadece 9 tane daha fazla rep! Tamam, şimdi elimden geleni yaptım. - Simon_Weaver
1.55kb'nin hiçbir şey olmadığını anlıyorum, ama yine de localStorage desteğini kontrol etmek için çok fazla gibi görünüyor. - Tyler Biscoe


Bu işlev iyi çalışıyor:

function supports_html5_storage(){
    try {
        return 'localStorage' in window && window['localStorage'] !== null;
    } catch(e) {
        return false;
    }
}

Kaynak: www.diveintohtml5.info


13
2017-08-15 10:02



Uzun zaman geçti. ve biliyorum ki kitabı okuduğumdan beri en iyi cevap bu. Soruma göre, NULL olmak için iki kez bir şey kontrol ediyoruz? - Ali Saberi
İlk önce düşünüyorum 'localStorage' in window özelliği, pencere nesnesinde var olduğunu kontrol eder ('undefined' değil) ve ikincisi window['localStorage'] !== null Bu özellik NULL olmadığını kontrol eder. - juanra
Bu, sadece katı olmayan bir eşitlik denetimi penceresinin ['localStorage'] == null yapmasıyla elde edilemez mi? Bu tanımsız ve null kontrolünü kapsar. - Triynko
Yani ben öyle tahmin ediyorum. Eğer ´window ['birşey'] == null 'seçeneğini işaretlerseniz, tanımlanmamış olsa bile sonuç "doğru" olur. Yine de, açıklık için ilk yöntemi seçerdim. - juanra


Deneyin window.localStorage!==undefined:

if(window.localStorage!==undefined){
    //Do something
}else{
    alert('Your browser is outdated!');
}

Ayrıca kullanabilirsiniz typeof window.localStorage!=="undefined"Ancak yukarıdaki ifade zaten var


8
2018-06-26 19:15



Safari, localStorage sahip olabilir ancak özel modda (QuotaExceededError) bir hata yaparsa, tr / catch en iyi seçenek IMHO'dur - Endless
Hm, bunu bilmiyordum. Ama sadece bir şeyler yazmaya çalışırken bu hatayı atar, değil mi? - Danilo Valente
Evet doğru - Endless
Aslında, window.localStorage özniteliğinin (bu örnekte gösterildiği gibi) yalnızca denetimi, Safari çerezleri ve web sitesi verilerini engellemek için ayarlandığında bir hata verir. özellikle: SecurityError: DOM Exception 18: An attempt was made to break through the security policy of the user agent. - Aaronius
Safari'deki gizli göz atma modu, localStorage'a yazmayı desteklemez, ancak bu onay bu durumda geçerli olur. Andreas'ın çözümü bu davayı ele alıyor. - Deepak Joy


Cevapları görmedim, ama bence bu basit testler için vanilya JS veya jQuery'yi kolayca kullanabileceğinizi bilmek çok güzel, ve Modernizr çok yardımcı olurken, onsuz temiz çözümler var.

Eğer kullanırsan jQuery, yapabilirsin:

var _supportsLocalStorage = !!window.localStorage
    && $.isFunction(localStorage.getItem)
    && $.isFunction(localStorage.setItem)
    && $.isFunction(localStorage.removeItem);

Ya da saf Vanilyalı JavaScript:

var _supportsLocalStorage = !!window.localStorage
    && typeof localStorage.getItem === 'function'
    && typeof localStorage.setItem === 'function'
    && typeof localStorage.removeItem === 'function';

Ardından, desteği test etmek için bir IF yaparsınız:

if (_supportsLocalStorage) {
    console.log('ls is supported');
    alert('ls is supported');
}

Bütün fikir, JavaScript özelliklerine ihtiyaç duyduğunuzda, önce ana nesneyi ve sonra kodunuzun kullandığı yöntemleri test etmenizdir.


6
2017-07-26 20:52





Yakalamayı deneyin işi yapacak:

    try{
       localStorage.setItem("name",name.value);
       localStorage.setItem("post",post.value);
       }
    catch(e){
       alert(e.message);    
       }

3
2017-08-10 09:02