为什么在Internet Explorer中访问localStorage对象会抛出错误?

Sim*_*hke 4 javascript internet-explorer local-storage modernizr

我正在处理客户端问题,其中Modernizr意外地检测不到localStorageInternet Explorer 9中对象的支持.我的页面正确使用HTML 5 doctype(<!DOCTYPE html>)和开发人员工具报告页面具有IE9的浏览器模式和文档IE9标准的模式,所以我希望这个工作.

我已调试到Modernizr中的以下try/ catch块,并发现一旦localStorage访问该对象就会抛出JavaScript错误.

tests['localstorage'] = function() {
    try {
        localStorage.setItem(mod, mod);
        localStorage.removeItem(mod);
        return true;
    } catch(e) {
        return false;
    }
};
Run Code Online (Sandbox Code Playgroud)

在某些机器上,JavaScript错误的消息是The system cannot find the file specified..在其他情况下它只是Invalid argument.和Internet Explorer阻止错误前5分钟.

是什么导致访问该localStorage对象在Internet Explorer上抛出错误?

Sim*_*hke 9

我已经发现,如果最低级别的子域与保留的设备名称之一匹配,如Internet Explorer 上的文件掩码和文件名属性的限制所述,则访问该localStorage对象将引发错误.

此问题可能发生,因为内部Internet Explorer在访问localStorage对象时尝试使用保留的设备名访问文件系统以满足Storage对象初始化步骤.

这当然是非常边缘的情况下,但如果你的网页是来自于它的最低级子域名正是任何一个服务器con,prn,aux,clock$,nul,com1,com2,com3,com4,com5,com6,com7,com8,com9,lpt1,lpt2,lpt3,lpt4,lpt5,lpt6,lpt7,lpt8,或lpt9(例如http://prn.example.com)那么这就是你看到这个问题的原因.

在这种情况下选择不是保留设备名称的较低级别子域解决了该问题.

  • 是的,当我发布问题时,我的答案确实很好.当然,这是一个非常好的边缘案例,但希望这将在某一天的某个时间保存其他人正是这个问题!:) (4认同)