Cách phát hiện xem trình duyệt có hỗ trợ Bộ nhớ cục bộ HTML5 hay không


84

Các cảnh báo mã sau ls existtrong IE7:

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

IE7 không thực sự hỗ trợ lưu trữ cục bộ nhưng điều này vẫn cảnh báo nó. Có lẽ điều này là do tôi đang sử dụng IE9 trong trình duyệt IE7 và các chế độ tài liệu bằng công cụ dành cho nhà phát triển IE9. Hoặc có thể đây chỉ là cách sai để kiểm tra xem LS có được hỗ trợ hay không. Đúng cách là gì?

Ngoài ra, tôi không muốn sử dụng Modernizr vì tôi chỉ sử dụng một vài tính năng HTML5 và việc tải một tập lệnh lớn không đáng chỉ để phát hiện hỗ trợ cho một số thứ đó.


Có thể có bản sao của Kiểm tra HTML 5 localStorage
BuZZ-dEE

Câu trả lời:


99

Bạn không cần phải sử dụng modernizr, nhưng bạn có thể sử dụng phương pháp của họ để phát hiện xem localStoragecó được hỗ trợ hay không

Modernnizr tại thử nghiệm github
cholocalStorage

// 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;
    }
});

được cập nhật với mã nguồn hiện tại


3
Thêm vào var mod = "test";trước khối try-catch, nếu không điều này sẽ luôn không thành công vì mod không được xác định ở đó.
Mahn

5
điều này có thể không thành công nếu không còn dung lượng trong bộ nhớ cục bộ.
Patrick

1
Thành thật mà nói, đây không phải là thử nghiệm tốt nhất vì điều gì sẽ xảy ra nếu bộ nhớ cục bộ đã đầy? localStorage có thể được hỗ trợ, nhưng chỉ ở trạng thái mà bạn không thể thêm.
DemiImp

2
Lưu ý, điều này sẽ kích hoạt các sự kiện lưu trữ trong các cửa sổ khác
Mark Swardstrom

2
@Andreas - Vâng, tôi biết. Thử nghiệm này sửa đổi bộ nhớ cục bộ. Nếu bạn không muốn điều đó xảy ra và chỉ muốn kiểm tra để được hỗ trợ, các giải pháp khác có thể là lựa chọn tốt hơn.
Mark Swardstrom

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

7
typeof(Storage) !== void(0)là giải pháp tốt hơn
Petja

2
@petjato nó thực sự nên là như vậyif (Storage !== void(0))
Andrew

4
typeofkhông phải là một hàm, nó là một toán tử ngôn ngữ. tại sao dấu ngoặc đơn?
r3wt

1
Đây dường như là một biến thể nhỏ của những gì được tìm thấy trên trang web W3Schools . Nó cũng dường như không hoạt động.
fujiiface

2
Chế độ duyệt web riêng tư trong Safari không hỗ trợ ghi vào localStorage, nhưng kiểm tra này trả về true cho trường hợp đó. Giải pháp của Andreas xử lý trường hợp này.
Deepak Joy

16

Chức năng này hoạt động tốt:

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

Nguồn: www.diveintohtml5.info


1
Nó đã qua một thời gian dài. và tôi biết, đó là câu trả lời hay nhất kể từ khi tôi đọc cuốn sách. Câu hỏi của tôi là tại sao chúng tôi kiểm tra một điều hai lần để được NULL?
Ali Saberi

Tôi nghĩ rằng lần đầu tiên 'localStorage' in windowkiểm tra rằng thuộc tính tồn tại trong đối tượng cửa sổ (không phải là 'không xác định') và lần thứ hai window['localStorage'] !== nullkiểm tra rằng thuộc tính đó không phải là NULL.
juanra

1
Không thể giải quyết điều đó bằng cách đơn giản thực hiện kiểm tra tính bình đẳng không nghiêm ngặt của window ['localStorage'] == null? Điều đó bao gồm cả kiểm tra không xác định và kiểm tra null.
Triynko

Tôi đoán vậy. Nếu bạn chọn ´window ['something'] == null´, kết quả là "true", ngay cả khi nó không được xác định. Tuy nhiên, tôi sẽ chọn phương pháp đầu tiên vì lợi ích rõ ràng.
juanra

15

Ngoài ra, tôi không muốn sử dụng Modernizr vì tôi chỉ sử dụng một vài tính năng HTML5 và việc tải một tập lệnh lớn không đáng chỉ để phát hiện hỗ trợ cho một số thứ đó.

Để giảm kích thước tệp Modernizr, hãy tùy chỉnh tệp tại http://modernizr.com/download/ để phù hợp với nhu cầu của bạn. Phiên bản chỉ dành cho lưu trữ cục bộ của Modernizr có dung lượng 1,55KB.


3
Xin chào, chào mừng bạn đến với Stack Overflow! Điều này thực sự nghe giống như nó nên là một bình luận hơn là một câu trả lời cho câu hỏi ban đầu. Tôi nhận ra rằng bạn chưa thể bình luận, nhưng đạt được 50 đại diện không khó hoặc mất thời gian.
Jesse

1
bạn có thể làm được - chỉ còn 9 đại diện nữa thôi! được rồi, tôi đã ủng hộ nên bây giờ bạn có 51
Simon_Weaver

Tôi nhận ra 1.55kb không là gì cả, nhưng nó vẫn có vẻ như quá mức cần thiết chỉ để kiểm tra hỗ trợ localStorage.
Tyler Biscoe

9

Hãy thử window.localStorage!==undefined:

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

Bạn cũng có thể sử dụng typeof window.localStorage!=="undefined", nhưng câu lệnh trên đã làm được


2
Safari có thể có localStorage nhưng sẽ xảy ra lỗi nếu ở chế độ riêng tư (QuotaExceededError) nên tr / catch là tùy chọn tốt nhất IMHO
Endless

1
Hm, tôi không biết điều đó. Nhưng nó chỉ ném ra lỗi đó khi cố gắng viết nội dung, phải không?
Danilo Valente

1
Trên thực tế, việc chỉ kiểm tra thuộc tính window.localStorage (như được hiển thị trong ví dụ này) sẽ gây ra lỗi khi Safari được thiết lập để chặn cookie và dữ liệu trang web. Cụ thể:SecurityError: DOM Exception 18: An attempt was made to break through the security policy of the user agent.
Aaronius

Chế độ duyệt web riêng tư trong Safari không hỗ trợ ghi vào localStorage, nhưng kiểm tra này trả về true cho trường hợp đó. Giải pháp của Andreas xử lý trường hợp này.
Deepak Joy

7

Tôi không thấy nó trong câu trả lời, nhưng tôi nghĩ thật tốt khi biết rằng bạn có thể dễ dàng sử dụng vanilla JS hoặc jQuery cho các bài kiểm tra đơn giản như vậy và trong khi Modernizr giúp ích rất nhiều, vẫn có những giải pháp sạch mà không cần đến nó.

Nếu bạn sử dụng jQuery , bạn có thể làm:

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

Hoặc, với JavaScript Vanilla thuần túy :

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

Sau đó, bạn chỉ cần thực hiện IF để kiểm tra hỗ trợ:

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

Vì vậy, toàn bộ ý tưởng là bất cứ khi nào bạn cần các tính năng JavaScript, trước tiên bạn sẽ kiểm tra đối tượng mẹ và sau đó là các phương thức mà mã của bạn sử dụng.


3

Hãy thử bắt sẽ thực hiện công việc:

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

1

Thử:

if(typeof window.localStorage != 'undefined') {
}

1
if (window.localStorage){

   alert('localStorage is supported');
   window.localStorage.setItem("whatever", "string value");

}

Câu trả lời hay nhất về đây bởi những bước nhảy vọt
alex bennett

1

Việc sửa đổi câu trả lời của Andrea để thêm getter giúp dễ sử dụng hơn. Với những điều dưới đây, bạn chỉ cần nói:if(ls)...

  var ls =  {
    get: function () { 
      var test = 'test';
      try {
        localStorage.setItem(test, test);
        localStorage.removeItem(test);
        return true;
      } catch(e) {
        return false;
      }
    }
  };

var ls =  {
  get: function () { 
    var test = 'test';
    try {
      localStorage.setItem(test, test);
      localStorage.removeItem(test);
      return true;
    } catch(e) {
      return false;
    }
  }
};

function script(){
  if(ls){
    alert('Yes');
  } else {
    alert('No');
  }
}
<button onclick="script()">Local Storage Support?</button>


0

Tôi biết mình đến bữa tiệc hơi muộn, nhưng tôi có một vài chức năng hữu ích mà tôi đã nấu và ném vào một tệp có tên 'management_storage.js ". Tôi hy vọng chúng hữu ích cho các bạn, vì chúng đã phục vụ tốt cho tôi.

Hãy nhớ: Chức năng bạn đang tìm (trả lời câu hỏi này) là isLclStorageAllowed.

Vì vậy, không cần quảng cáo thêm đây là mã của tôi:

/* Conditional Function checks a web browser for 'session storage' support. [BEGIN] */

if (typeof isSessStorageAllowed !== 'function')
    {
        function isSessStorageAllowed()
            {
                if (!!window.sessionStorage && typeof sessionStorage.getItem === 'function' && typeof sessionStorage.setItem === 'function' && typeof sessionStorage.removeItem === 'function')
                    {
                        try
                            {
                                var cur_dt = new Date();
                                var cur_tm = cur_dt.getTime();
                                var ss_test_itm_key = 'ss_test_itm_' + String(cur_tm);
                                var ss_test_val = 'ss_test_val_' + String(cur_tm);

                                sessionStorage.setItem(ss_test_itm_key, String(ss_test_val));

                                if (sessionStorage.getItem(ss_test_itm_key) == String(ss_test_val))
                                    {
                                        return true;
                                    }
                                else
                                    {
                                        return false;
                                    };

                                sessionStorage.removeItem(ss_test_itm_key);
                            }
                        catch (exception)
                            {
                                return false;
                            };
                    }
                else
                    {
                        return false;
                    };
            };
    };

/* Conditional Function checks a web browser for 'session storage' support. [END] */

/* Conditional Function checks a web browser for 'local storage' support. [BEGIN] */

if (typeof isLclStorageAllowed !== 'function')
    {
        function isLclStorageAllowed()
            {
                if (!!window.localStorage && typeof localStorage.getItem === 'function' && typeof localStorage.setItem === 'function' && typeof localStorage.removeItem === 'function')
                    {
                        try
                            {
                                var cur_dt = new Date();
                                var cur_tm = cur_dt.getTime();
                                var ls_test_itm_key = 'ls_test_itm_' + String(cur_tm);
                                var ls_test_val = 'ls_test_val_' + String(cur_tm);

                                localStorage.setItem(ls_test_itm_key, String(ls_test_val));

                                if (localStorage.getItem(ls_test_itm_key) == String(ls_test_val))
                                    {
                                        return true;
                                    }
                                else
                                    {
                                        return false;
                                    };

                                localStorage.removeItem(ls_test_itm_key);
                            }
                        catch (exception)
                            {
                                return false;
                            };
                    }
                else
                    {
                        return false;
                    };
            };
    };

/* Conditional Function checks a web browser for 'local storage' support. [END] */

/* Conditional Function checks a web browser for 'web storage' support. [BEGIN] */

/* Prerequisites: 'isSessStorageAllowed()', 'isLclStorageAllowed()' */

if (typeof isWebStorageAllowed !== 'function')
    {
        function isWebStorageAllowed()
            {
                if (isSessStorageAllowed() === true && isLclStorageAllowed() === true)
                    {
                        return true;
                    }
                else
                    {
                        return false;
                    };
            };
    };

/* Conditional Function checks a web browser for 'web storage' support. [END] */
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.