CORS错误取决于图像参数设置顺序

时间:2014-03-27 15:57:59

标签: javascript image canvas cors

我使用画布显示图像,并使用getImageData()获取该图像特定部分的信息。根据我设置图像参数的顺序,它是否有效。

在文档正文中使用onload调用该方法。这是代码:

function draw() {
  var canvas = document.getElementById("canvas");
  if (canvas.getContext) {
    var ctx = canvas.getContext("2d");
    var img = new Image();

    img.src = "url_to_image";
    img.crossOrigin = "anonymous";
    canvas.width = img.width;
    canvas.height = img.height;
    ctx.drawImage( img, 0, 0 );
    var data = document.getElementById('canvas').getContext('2d').getImageData( 310, 320, 1, 1 ).data
  }
}

这会触发以下crossOrigin错误:

Cross-origin image load denied by Cross-Origin Resource Sharing policy.

我从中获取图像的服务器配置为使用图像为我设置Access-Control-Allow-Origin:*响应标头。

但是,如果我在img.crossOrigin之前设置image.src,一切正常:

img.crossOrigin = "anonymous";
img.src = "url_to_image";

这对我来说似乎非常特殊。有人知道发生了什么吗?

1 个答案:

答案 0 :(得分:3)

.crossOrigin必须在.src之前

那是因为.src实际上开始下载。

浏览器必须知道在开始下载时是否允许匿名访问,否则默认情况下不允许跨域访问。

现代浏览器(FF,Chrome,Safari,Opera,Android)几乎完全支持Cross Origin共享。 Opera的迷你版是唯一主要的非支持浏览器。

而且,正如您所发现的那样,提供数据的服务器必须配置为发送适当的标头,让浏览器知道允许交叉共享。