当我尝试设置一个 cookie 时,出现了“未捕获错误:SECURITY_ERR:DOM 异常 18”的错误。

122

当我尝试使用 jQuery 插件设置 cookie 时,我在 Chrome 开发者工具窗口中收到以下错误信息:

Uncaught Error: SECURITY_ERR: DOM Exception 18

这个错误是什么意思,如何解决?我在使用 jQuery 插件时也会遇到相同的错误。


如果您的问题与画布有关,这就是答案:https://dev59.com/1HE95IYBdhLWcg3wQ7mb#41510086 - jose920405
9个回答

152

你很可能正在使用此功能于本地文件,URI方案为file://,这种方式无法设置cookie。将其放到本地服务器上,这样你就可以使用http://localhost了。


26
当我从file://加载画布并使用getImageData()时,也发生了同样的情况。 - Timmmm
6
好的,调用getImageData()方法加载来自另一个主机的图片时也会出现这种情况。将文件移动到同一域/协议等可以解决这个问题。 - mike clagg
28
专业提示:如果您已经安装了Python,只需在您网站的根目录中输入“python -m SimpleHTTPServer”,然后在http://localhost:8000找到它托管的页面。 - Thomas
6
针对Python 3,如果想要达到相同的效果,你需要执行 python -m http.server 8000 - Kat
2
如果您是iOS开发人员,您可能会感兴趣地知道,在将HTML直接加载到UIWebView控件中后尝试使用localStorage时,我也遇到了此问题。https://dev59.com/Wmgu5IYBdhLWcg3wYGC3 - Felipe Sabino
显示剩余4条评论

18

在本地开发HTML5时,我也遇到了这个问题。我遇到了与图像和getImageData函数相关的问题。最终,我发现可以使用--allow-file-access-from-file命令行开关启动Chrome,从而摆脱此保护安全性问题。唯一的问题是它会使您的浏览器不太安全,并且您无法同时使用带有开关标记和不带开关标记的另一个chrome实例。


4
当您使用--allow-file-access-from-files(请注意,现在是复数形式)时,必须记住该开关仅在没有其他Chrome实例正在运行时才会生效。 - BlueMonkMN

11
您也可以通过使用内联 Base64 表示替换图像来“修复”此问题:
img.src= "data:image/gif;base64,R0lGODlhCwALAIAAAAAA3pn/ZiH5BAEAAAEALAAAAAALAAsAAAIUhA+hkcuO4lmNVindo7qyrIXiGBYAOw==";
这在您不打算在 Web 上发布页面,而是仅在本地机器上使用时非常有用。

4
有什么办法可以获取画布的base64表示方式,且不会出现错误?请注意:翻译时请勿更改原意、不要添加解释或其他内容。 - devios1
var canvas = document.createElement("canvas"); canvas.width = 128; canvas.height = 128; var ctx = canvas.getContext('2d'); ctx.fillRect(25,25,100,100); ctx.clearRect(45,45,60,60); ctx.strokeRect(50,50,50,50); return ctx.getImageData(0, 0, 128, 128); - Ray Hulha

10
面对同样的情况,使用Javascript 进行编程。不幸的是,Chrome 不允许访问存储在本地文件中的javascript workers。
一种解决方法是使用本地存储来绕过此问题,在运行Chrome时添加--allow-file-access-from-files(注意末尾的s),但只允许一个Chrome实例,这对我来说不太方便。因此,我使用允许文件访问的Chrome Canary。
顺便提一下,在Firefox中没有这样的问题。

我希望我可以多次点赞。你的答案刚刚让我省了大量时间,不用再对着屏幕瞪眼了!非常感谢!! - Jaime

5

4

在使用历史API时,我遇到了这个问题。

window.history.pushState(null, null, URL);

即使使用本地服务器(localhost),您也需要在URL中添加“http://”,以便得到类似以下的东西:
http://localhost...

3

我对于--allow-file-access-from-files的解决方案并不完全满意,因为我使用Chrome作为我的主要浏览器,而且对于我所开放的这个漏洞并不满意。

现在我在开发时使用Canary(Chrome的beta版本)并开启了该标志。而在实际博客发布时则使用普通版本的Chrome:这两个浏览器不共享该标志!


1
对于那些好奇的人,现在是--allow-file-access-from-files(带有s)。 - Shane Reustle

2

如果在获取权限之前使用新的(目前仅适用于webkit)通知功能,也可能会收到此错误。

首先运行:

<!-- Get permission -->
<button onclick="webkitNotifications.requestPermission();">Enable Notifications</button>

之后运行:

// Display Notification:
window.webkitNotifications.createNotification('image', 'Title', 'Body').show();

请求权限函数需要从用户引起的事件触发,否则它将不会显示。

1

当我使用ASP.NET MVC返回一个FileResult时,如果使用重载方法返回一个文件名与原始文件名不同的文件,在移动版Safari中会出现错误。

return File(returnFilePath, contentType, fileName);

这会在移动版Safari中出现错误。

return File(returnFilePath, contentType);

不会的。

我甚至都不记得为什么当时认为自己在做一个好主意。可能只是想要聪明一些吧。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接