3

我正在编写能够使用localStorage或sessionStorage的Javascript类。这个选择是在一个类实例的基础上完成的。在不同浏览器中检测localStorage v sessionStorage对象

我有这个类中的方法,它接收存储对象作为参数,并根据存储类型(即本地v会话)运行一个操作。

例如,

function myMethod(store){ 
    // store: object storageObject 
    //  The storage object being used (either 
    //  sessionStorage or localStorage). 

    if(store === sessionStorage){ 
     return sessionAction(store) 
    }else if(store === localStorage){ 
     return localAction(store) 
    } 

    return null; 
} 

这并不在Internet Explorer 8的工作,产生了错误: “类不支持自动化”。它似乎可以在其他浏览器中很好地工作。

我试图获取对象类型(通过Object.prototype.toString.call()和测试针对IE8却始终报告的翻译:这一点。我设法从答案到Stackoverflow问题取得了一些进展:Weird IE8 internal [[ class ]] attribute behavior。这个解决方法在IE中给了我[对象存储]。

但是,我仍然无法检测到不同的存储类型。是否有一种简单的方法来检测跨浏览器的两种类型?

我可以重写它,所以类型不能作为参数提供给方法。但是,我宁愿通过允许用户简单地提供存储对象来降低API的简单性。

回答

2

你可以去侵略性为IE8代码分支(由Modernizr启发):

比较储存:

function storagesEqual(testStorage, webStorage) { 
    try { 
     return testStorage === webStorage; 
    } catch (ex) { 
     // IE8 code branch 
     var testKey = "storage-test"; 
     var testValue = (new Date()).valueOf().toString(); 
     var result = false; 

     try { 
      webStorage.setItem(testKey, testValue); 
      if(testStorage[testKey] === testValue) { 
       webStorage.removeItem(testKey); 
       result = true; 
      } 
     } finally { 
      return result; 
     } 
    } 
} 

Indetify存储类型:

function storageType(store) { 

    var STORAGE_LOCAL = 'local'; 
    var STORAGE_SESSION = 'session'; 
    var STORAGE_UNKNOWN = 'unknown'; 

    var localStorage = window.localStorage; 
    var sessionStorage = window.sessionStorage; 

    if(storagesEqual(store, localStorage)) return STORAGE_LOCAL; 
    if(storagesEqual(store, sessionStorage)) return STORAGE_SESSION; 
    return STORAGE_UNKNOWN; 
} 
+0

谢谢为了那个原因。是的,如果我希望IE8按照要求工作,那么蛮力方法可能是唯一的途径。想想,我对此很好;效率低下是可以接受的,因为它只会影响大约5%的用户。这些用户已经在使用IE8时遇到了严重的低效率问题,因此在这个宏伟的计划中,它可能无关紧要。此外,这5%可能会随着时间的推移而减少。 – 2013-03-04 12:09:09