Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/425.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Chrome iframe中的存储崩溃_Javascript_Angularjs_Google Chrome - Fatal编程技术网

Javascript Chrome iframe中的存储崩溃

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

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/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') : {};