Javascript Chrome iframe中的存储崩溃
Chrome在跨域iframe中运行时拒绝访问localStorage。 这会导致ngStorage使整个应用程序崩溃 演示: 堆栈跟踪:Javascript Chrome iframe中的存储崩溃,javascript,angularjs,google-chrome,Javascript,Angularjs,Google Chrome,Chrome在跨域iframe中运行时拒绝访问localStorage。 这会导致ngStorage使整个应用程序崩溃 演示: 堆栈跟踪: 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/mast
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已经说过的,当阻止跟踪cookies时会发生这种情况。
然而,强迫我们的用户接受跟踪cookies不是一个选项
在不崩溃方面是否有任何解决方法?
丢失存储的数据不是问题
默认浏览器设置:
此JSFIDLE适用于我的chrome浏览器版本36.0.1985.125 m 也许你已经损坏了存储。尝试使用上的清除您的存储 . 或者使用js:localStorage.clear 您正在使用的存储模块包含检查本地存储是否受支持的代码: 但是,正如您所注意到的,这并不适用于它被支持但被禁用的情况 最简单的解决方案是修改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.')
}
似乎已经有了类似的代码变更
由于ngStorage在实例化这些服务时崩溃,您还可以根据自己的检查将应用程序更改为有条件地加载$localStorage,代价是一些难看的非惯用代码:
var localStorage;
try {
localStorage = $window.localStorage;
}
catch (ex) {}
var $localStorage = localStorage ? $injector.get('$localStorage') : {};
这假设您不需要在控制器中请求$localStorage依赖项,而是请求$window和$injector,然后只有在证明$localStorage可以工作后才动态实例化它。如果您在应用程序中的许多地方访问本地存储,那么您可以将其考虑到您自己的服务中。不过,推动将补丁包含在ngStorage中当然更干净。提供的JSFIDLE在38.0.2096.0版本中工作得非常好,我不明白。您要求浏览器阻止第三方cookie和站点数据,但您希望访问第三方站点数据,即localStorage。据我所知,所有浏览器上的标准设置都允许第三方存储数据。如果不允许此设置,则不存在解决方法。你可以看看饼干,JStorage,没关系。浏览器不允许保存任何数据。这是一种锁定模式。@DaveA我可以不访问它或丢失会话数据-我只是不想让它破坏我的应用程序-这看起来是一个很好的解决方法-您提到的问题是由我打开的,但看起来ngStorage没有得到很好的维护。哦,呵呵。很抱歉,我没有在github和stackoverflow上建立用户之间的连接,即使名称相同。抱歉,这是多余的。$log.warn是否向最终用户显示消息?还是取决于注射?我可以在IE中调试.js文件,但不能在chrome中调试,因此我不能在它上面点一个断点,然后跟踪它。
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.')
}
var localStorage;
try {
localStorage = $window.localStorage;
}
catch (ex) {}
var $localStorage = localStorage ? $injector.get('$localStorage') : {};