最近在使用 Canvas 时,遇到了跨域问题。本文介绍如何解决这类跨域问题。
更多精彩内容请看 web 前端中文站
http://www.lisa33xiaoq.net 可按 Ctrl + D 进行收藏
具体的错误信息如下:
Uncaught DOMException: Failed to execute ‘getImageData’ on ‘CanvasRenderingContext2D‘: The canvas has been tainted by cross-origin data.
对于跨域的图片,只要能够在网页中正常显示出来,就可以使用 canvas 的 drawImage() API 绘制出来。但是如果你想更进一步,通过getImageData()方法获取图片的完整的像素信息,则多半会出错。
看下面的一个例子:
var canvas = document.createElement('canvas'); var context = canvas.getContext('2d'); // web 前端中文站 www.lisa33xiaoq.net var img = new Image(); img.onload = function () { context.drawImage(this, 0, 0); context.getImageData(0, 0, this.width, this.height); }; img.src = 'https://avatars3.githubusercontent.com/u/496048?s=120&v=4';
运行后,Firefox 浏览器错误为:
SecurityError: The operation is insecure.
那有没有什么办法可以解决这个问题呢?
在 HTML5 中,有些元素提供了支持 CORS(Cross-Origin Resource Sharing)(跨域资源共享)的属性,这些元素包括<img>,<video>,<script>等,而提供的属性名就是 crossOrigin 属性。
因此,上面的跨域问题可以这么处理:
var canvas = document.createElement('canvas'); var context = canvas.getContext('2d'); // web 前端中文站 www.lisa33xiaoq.net var img = new Image(); img.crossOrigin = ''; img.onload = function () { context.drawImage(this, 0, 0); context.getImageData(0, 0, this.width, this.height); }; img.src = 'https://avatars3.githubusercontent.com/u/496048?s=120&v=4';
增加一个 img.crossOrigin = ”即可,虽然 JS 代码这里设置的是空字符串,实际上起作用的属性值是 anonymous。
crossOrigin 可以有下面两个值:
关键字 | 释义 |
---|---|
anonymous | 元素的跨域资源请求不需要凭证标志设置。 |
use-credentials | 元素的跨域资源请求需要凭证标志设置,意味着该请求需要提供凭证。 |
其中,只要 crossOrigin 的属性值不是 use-credentials,全部都会解析为 anonymous,包括空字符串,包括类似’lisa33xiaoq.net’这样的字符。
例如:
img.crossOrigin = 'lisa33xiaoq.net'; console.log(img.crossOrigin); // 结果是'anonymous'
另外还有一点需要注意,那就是虽然没有 crossOrigin 属性,和设置 crossOrigin=”use-credentials”在默认情况下都会报跨域出错,但是性质上却不一样,两者有较大区别。
IE11+,Safari,Chrome,Firefox 浏览器均支持,IE9 和 IE10 会报 SecurityError 安全错误。
【注:本文源自网络文章资源,由站长整理发布】