ng3torage在Chrome iframe中崩溃

时间:2014-07-17 19:31:04

标签: javascript angularjs google-chrome

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不是一种选择

Chrome Security Settings

是否有任何解决方法,它不会崩溃?
丢失存储的数据不是问题。

默认浏览器设置:
Browser defaults

2 个答案:

答案 0 :(得分:0)

这个jsFiddle适用于我的Chrome浏览器(版本36.0.1985.125 m)。

也许您的存储已损坏。尝试使用$reset()上的plnkr.co website清除您的ngStorage。

<button ng-click="$storage.$reset({
      x: 999
    })">Clear localStorage</button>

Like this

(或使用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中的补丁肯定更清晰。