2013-05-07 151 views
43

我知道關於檢查localStorage有很多問題,但如果有人在瀏覽器中手動關閉它,會發生什麼?這裏是我用來檢查的代碼:檢查localStorage是否可用

localStorage.setItem('mod', 'mod'); 
if (localStorage.getItem('mod') != null){ 
    alert ("yes"); 
    localStorage.removeItem('mod'); 
}else{ 
    alert ("no"); 
} 

簡單的功能,它的工作原理。但是,如果我進入我的Chrome設置並選擇「不保存數據」選項(我不記得確切地說它叫做什麼),當我嘗試運行此功能時,我什麼也得不到,除了Uncaught Error: SecurityError: DOM Exception 18。那麼是否有辦法檢查該人是否完全關閉了它?

更新:這是我嘗試的第二個功能,我仍然沒有響應(警報)。

try { 
localStorage.setItem("name", "Hello World!"); 
} catch (e) { 
if (e == QUOTA_EXCEEDED_ERR) { 
    alert('Quota exceeded!'); 
} 
} 
+1

發現異常? – PeeHaa 2013-05-07 20:09:02

+0

仍然不能提供任何方式來查看它是否正常工作... – user2025469 2013-05-07 20:21:06

+5

Uhhhhmmm。如果它拋出一個你知道的異常*它不起作用 – PeeHaa 2013-05-07 20:23:32

回答

79

使用modernizr的方法(你可能想改變我的函數名更好的東西):

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

if(lsTest() === true){ 
    // available 
}else{ 
    // unavailable 
} 

它不像其他方法簡潔,但是那是因爲它的設計最大限度地兼容。

最初來源:https://github.com/Modernizr/Modernizr/blob/master/feature-detects/storage/localstorage.js

工作例如:http://jsfiddle.net/6sm54/2/

+1

嘿喬,我運行你的函數(LS打開或關閉)時出現此錯誤「未捕獲的SyntaxError:非法返回語句」 – user2025469 2013-05-07 20:18:40

+1

@ user2025469此代碼旨在用作函數。 – Kiruse 2013-05-07 20:19:41

+1

對不起,我應該提到這一點。我已經更新了我的答案並添加了一個演示,以便您可以看到它正常工作。 – Joe 2013-05-07 20:27:02

9

我檢查localStorage之前依賴於它的任何行動定義:

if (typeof localStorage !== 'undefined') { 
    var x = localStorage.getItem('mod'); 
} else { 
    // localStorage not defined 
} 

UPDATE:

如果您需要驗證該功能是存在的,它也沒有關閉,你必須使用更安全的方法。爲了萬無一失:

if (typeof localStorage !== 'undefined') { 
    try { 
     localStorage.setItem('feature_test', 'yes'); 
     if (localStorage.getItem('feature_test') === 'yes') { 
      localStorage.removeItem('feature_test'); 
      // localStorage is enabled 
     } else { 
      // localStorage is disabled 
     } 
    } catch(e) { 
     // localStorage is disabled 
    } 
} else { 
    // localStorage is not available 
} 
+1

在給定的情況下,這只是一個功能,可以防止其他瀏覽器出錯......所以這並不能真正回答這個問題。如果關閉,'localStorage'仍然在'window'中定義。 – Kiruse 2013-05-07 20:17:42

+0

你仍然會得到一個DOM錯誤...我只是不能相信有沒有辦法檢查它是否完全關閉... – user2025469 2013-05-07 20:21:54

+1

這不是一個安全的Chrome和Opera的方法...可能不是Safari或者是因爲'localStorage'是完全無法訪問的,並且會拋出異常。 – Shikkediel 2016-12-08 17:06:15

-2

使用此檢查localStorage的設置與否。它幫助你獲得Localstorage的狀態。

if(window.localStorage.fullName !== undefined){ 

      //action 
    }else{ 
      } 
+4

您不需要等待文檔被加載來訪問localStorage(所以'$()'是毫無意義的)更重要的是,如果localStorage不可用,這段代碼將會拋出一個錯誤。 – 1j01 2014-03-08 14:38:44

+0

實際上,Mozilla文檔指出'localStorage'本質上是同步的,所以它可以阻止主文檔的渲染。等待它準備好將是一個好方法。 – Shikkediel 2016-12-08 17:35:40

+0

他們說'localStorage'是同步的意思是'localStorage.getItem('someKey')'實際上立即返回該項目。它不接受回調函數或返回'Promise',它只是立即返回數據。與例如'var result = fetch('https://example.com/data.json')'...返回一個'Promise',這使得它是異步的。你將不得不調用'then'方法來獲取數據(只會在下一個打勾期間發生):'result.then(function(data){/ * only here do we get the data * /})' – 2017-01-23 18:40:58

-1

修改Joe的添加getter的答案使其更易於使用。隨着下面你乾脆說:if(ls)...

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

爲什麼downvote?它的工作原理是,輸入'ls'比輸入'lsTest()=== true'更好。 ...? – 2017-01-04 16:12:02

+0

它不起作用。你正在給'ls'分配一個對象......因此'如果(ls)'總是評估爲'true'。只需通過改變你的'get'方法來讀取'get:function(){return false}'來檢查它,你就會看到。另外,輸入'ls'並不會更好....在你的代碼中這個測試不會太頻繁(如果你用聰明的方式編寫它),那麼爲什麼用一個非常短的變量來污染(全局)範圍呢? – 2017-01-23 18:33:25

+0

你的權利。我必須解決這個問題......謝謝! – 2017-01-23 18:52:49

-1

下面是一個簡單的檢查:

if(typeof localStorage === 'undefined'){

+2

localStorage類型返回對象,即使它在Firefox或IE中被禁用。在Chrome和Opera中,'typeof'會拋出一個異常,並在用戶關閉時破壞整個腳本... – Shikkediel 2016-12-08 03:29:09

+1

@Shikkediel對此非常感謝 – Brady 2016-12-08 15:47:49

+0

在隱私瀏覽模式下,您將獲得一個可工作的'localStorage'對象它的配額爲零,因此每當您嘗試寫入時都會引發異常。這就是爲什麼本地存儲功能檢測代碼現在總是試圖寫入一個項目。 – 2017-01-23 18:42:46

2

功能檢測本地存儲是棘手的。你需要真正涉足它。原因在於Safari選擇在私人模式下提供功能localStorage對象,但其配額設置爲零。這意味着雖然所有簡單功能檢測都會通過,但任何對localStorage.setItem的調用都會引發異常。

Mozilla在Web Storage API上的Developer Network條目有一個dedicated section on feature detecting local storage。下面是該網頁推薦的方法:

function storageAvailable(type) { 
    try { 
     var storage = window[type], 
      x = '__storage_test__'; 
     storage.setItem(x, x); 
     storage.removeItem(x); 
     return true; 
    } 
    catch(e) { 
     return false; 
    } 
} 

這裏是你將如何使用它:

if (storageAvailable('localStorage')) { 
    // Yippee! We can use localStorage awesomeness 
} 
else { 
    // Too bad, no localStorage for us 
} 

如果您使用NPM,您可以用搶storage-available

npm install -S storage-available 

然後使用如下功能:

if (require('storage-available')('localStorage')) { 
    // Yippee! We can use localStorage awesomeness 
} 

免責聲明:MDN和NPM軟件包的文檔部分均由我撰寫。

0

使用此功能,您可以檢查本地存儲是否可用,並且您可以控制可能出現的異常。

function isLocalStorageAvailable() { 

    try { 
     var valueToStore = 'test'; 
     var mykey = 'key'; 
     localStorage.setItem(mykey, valueToStore); 
     var recoveredValue = localStorage.getItem(mykey); 
     localStorage.removeItem(mykey); 

     return recoveredValue === valueToStore; 
    } catch(e) { 
     return false; 
    } 
}