2012-10-09 41 views
9

經過我們的一位用戶的投訴並運行一些測試後,它顯示Firefox 15和16(以及可能是舊版本)使得它如此,如果您禁用了cookie, localStorage的。你甚至不能爲它創建一個填充工具作爲每當您嘗試訪問window.localStorageError: The operation is insecure.Firefox用戶禁用cookies以及localStorage的解決方案 - 不可能填充

投擲嘗試捕捉將讓你檢查,看看它是否禁用,但不會讓你有自己的解決方案替換變量。下面的快速填充工具將無法工作,因爲FF忽略設置變量,並試圖訪問它時,會拋出同樣的錯誤:

​​

唯一的解決辦法似乎是動了「假」 localStorage的另一個變量,但這將煩人,因爲我們有很多代碼和依賴訪問這個變量的js庫。任何解決方案

編輯:僅僅彈出警告以告訴用戶需要cookie是不是最佳的。如果訪問者只想查看網站而不註冊,那麼他們確實不需要cookie。但作爲backbone.js應用程序並傳遞大量數據,我們確實在localStorage中存儲了相當多的東西。

+3

如果您可以檢查它是否被禁用,只需彈出警告或告訴他們他們需要爲您的網站啓用Cookie。 – MrOBrian

+0

感謝MrObrian,我做到了這一點,並且正在爲消息注入一個div,但對於localStorage只是作爲一個沒有持續存在的鍵/值存儲區而言是最佳選擇,因爲這正是用戶想要的。 –

+0

「,但是對於localStorage來說,只是作爲不會持續存在的鍵/值存儲區而工作的最佳選擇」 爲什麼不在這種情況下使用簡單的js數組? –

回答

0

我們用它作爲我們的本地存儲庫。

(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

這個解決方案的問題是你必須使用它來設置你的「localStorage」的東西,而不是真正的localStorage – DeMeNteD

1

由於localStorage是一個保留變量,因此除了使用不同名稱的包裝器之外,沒有其他理智選項。將自己的代碼和真正的localStorage包裝在這個變量下,並用你的包裝名替換localStorage。討厭,但比失去變化少煩人。

1

你有兩個選擇:

1)取詞法作用域的優勢和查找是如何工作的?例如,如果你的代碼是在一個封閉運行,那麼閉包內,你可以運行以下命令:

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

然後在您的代碼中只使用localStorage而不是完全限定的window.localStorage。這裏的優勢就是詞法變量查找的方式,它會找到更「緊密」的範圍化版本而不是全局範圍。 PS ......你應該可能在關閉時運行,所以這應該是可能的。 2)只是變量重命名,類似於人們做移除供應商前綴的逆過程。

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

然後,只需改變你的代碼,使用pLocalStorage而不是localStorage的......如果他們的瀏覽器支持的話,那麼它會使用原生,否則填充工具。

+0

尼克,重申我在原始問題中寫道的問題:「你甚至不能創建一個polyfill爲它每當你嘗試訪問window.localStorage你會得到錯誤:操作是不安全的。「如果禁用cookie,則甚至不會引用此變量而不會拋出JS錯誤。 –

+0

Mauvis ...無法在Mac版本中發生文字錯誤。也就是說第二個選項可以和一些mod一起使用,以便在你的問題中使用try try ... 嘗試window.pLocalStorage = window.localStorage; (kr){ } catch(err){ window.pLocalStorage = { getItem:function(k){ return this.k; }, setItem:function(k,v){ this.k = v; } }; } –