我一直以为Internet Explorer 10完全支持CORS,但现在我不确定了。
我们有一个JS/HTML5应用程序,使用多个域,并读取图像数据。我们在JS中从另一个域加载图像,imageDraw()将图像加载到画布上,然后在画布上使用getImageData。(我们不使用跨域xmlhttprequest)。为此,我们必须在提供图像的服务器上设置响应头:
access-control-allow-origin: *
access-control-allow-credentials: true
并在加载前将其设置在JS中的image对象上:
image.crossOrigin = 'Anonymous'; //Also tried lowercase
这在所有新浏览器上都可以正常工作,除了IE10,当我们尝试读取数据时,会抛出安全错误。
SCRIPT5022: SecurityError
是否需要为IE10做更多的事情来处理这些跨域图像而不是污染?
更新:我注意到了前面一个问题的答案。有趣的是,这个JSFiddle也不能在IE10中工作-有人能确认这不能在他们的IE10中工作吗?
不幸的是,IE10仍然是唯一一个不支持CORS的流行浏览器,即使CORS标头被正确设置。但也可以通过XMLHttpRequest:
解决这个问题var xhr = new XMLHttpRequest();
xhr.onload = function () {
var url = URL.createObjectURL(this.response), img = new Image();
img.onload = function () {
// here you can use img for drawing to canvas and handling
// ...
// don't forget to free memory up when you're done (you can do this as soon as image is drawn to canvas)
URL.revokeObjectURL(url);
};
img.src = url;
};
xhr.open('GET', url, true);
xhr.responseType = 'blob';
xhr.send();
确认:IE10不支持HTML 5画布中的CORS图像。rreverver的解决方案
编辑
对不起,我以前没有处理过CORS图像,并认为这个问题是关于AJAX请求的
根据Mozilla开发人员网络,需要设置"image.crossOrigin
"为"anonymous
"或"use-credentials
"。而且,根据今天的页面,这些属性在IE、Safari和Opera中都不支持。这个测试是为了证明IE9不支持它,似乎同样的测试在IE10中仍然失败,所以即使Safari和Opera在MDN文章写完后增加了支持,IE10很可能仍然缺乏支持。
我能给您的唯一提示是,通常,allow-credentials与通配符allow-origin不兼容。要么删除allow-凭据,要么回显allow-origin中的请求Origin。
下面是AJAX调用,而不是图像或视频画布资源
早期版本的IE10已知有AJAX漏洞,
- http://bugs.idsl.pl/ie/xhr.htm
- http://connect.microsoft.com/IE/feedback/details/771552/i-e-10-and-the-post-method
所以这可能是另一个浏览器错误。不过,CORS的正确设置似乎很棘手。我建议按照以下步骤调试CORS问题。
- 将浏览器指向http://test-cors.appspot.com/#technical以获取兼容性报告。如果有任何失败,则说明浏览器中存在错误或缺乏对CORS的支持。
- 如果一切顺利,使用测试发送的CORS标头作为起点,以使CORS请求工作。然后一次更改一个标头并重新测试,直到您获得应用程序所需的标头,或者您遇到无法解释或解决的故障。
- 如果有必要,发布一个关于打破CORS请求的一个微小变化的问题,发布工作"之前"和失败"之后"。如果您可以包含一个可运行的示例,这总是有帮助的。
CORS测试客户端和服务器的完整代码(Google App Engine的Python脚本)可在https://github.com/rapportive-oss/cors-test获得,以帮助您开始。