Chrome在跨域iframe中运行时拒绝访问localStorage 这会导致ngStorage崩溃整个应用程序
演示: http://jsfiddle.net/e8y85/
堆栈跟踪:
Error: Failed to read the 'localStorage' property from 'Window': Access is denied for this document.
at Error (native)
at Object. (https://rawgit.com/gsklee/ngStorage/master/ngStorage.js:42:41)
at Object.d [as invoke] (https://code.angularjs.org/1.1.5/angular.min.js:28:304)
at https://code.angularjs.org/1.1.5/angular.min.js:30:39
at c (https://code.angularjs.org/1.1.5/angular.min.js:27:142)
at d (https://code.angularjs.org/1.1.5/angular.min.js:27:276)
at Object.instantiate (https://code.angularjs.org/1.1.5/angular.min.js:28:434)
at https://code.angularjs.org/1.1.5/angular.min.js:53:326
at https://code.angularjs.org/1.1.5/angular.min.js:44:274
at n (https://code.angularjs.org/1.1.5/angular.min.js:7:74)
正如Dave已经说过阻止跟踪cookie时会发生这种情况。 但是,强制我们的用户接受跟踪Cookie不是一种选择
是否有任何解决方法,它不会崩溃?
丢失存储的数据不是问题。
答案 0 :(得分:0)
这个jsFiddle适用于我的Chrome浏览器(版本36.0.1985.125 m)。
也许您的存储已损坏。尝试使用$reset()
上的plnkr.co website清除您的ngStorage。
<button ng-click="$storage.$reset({
x: 999
})">Clear localStorage</button>
(或使用js:localStorage.clear();
)。
答案 1 :(得分:0)
您使用的ngStorage
模块包含检查本地存储是否支持的代码:
var webStorage = $window[storageType] || ($log.warn('This browser does not support Web Storage!'), {})
但是,正如您已经注意到,这并不能解决支持但已禁用的情况。
最简单的解决方案是修改ngStorage
本身来处理这种情况。例如:
var webStorage;
try {
webStorage = $window[storageType] || ($log.warn('This browser does not support Web Storage!'), {});
}
catch (ex) {
webStorage = {};
$log.warn('Access to web storage is denied.')
}
似乎an issue open for this附加了类似的代码更改。
由于ngStorage
在实例化这些服务时崩溃,您还可以根据自己的检查更改应用程序以有条件地加载$localStorage
,代价是一些丑陋的非惯用代码:< / p>
var localStorage;
try {
localStorage = $window.localStorage;
}
catch (ex) {}
var $localStorage = localStorage ? $injector.get('$localStorage') : {};
这假设您不是在控制器中请求$localStorage
依赖项,而是请求$window
和$injector
,然后在您&#39之后动态实例化$localStorage
已经证明它会起作用。如果您在应用程序的许多位置访问本地存储,则可以将其分解为您自己的服务。然而,推送要包含在ngStorage
中的补丁肯定更清晰。