Javascript IE9:canvas.toDataURL安全性\u错误

Javascript IE9:canvas.toDataURL安全性\u错误,javascript,html,canvas,base64,Javascript,Html,Canvas,Base64,我正在尝试将facebook图像转换为base64,但是FileReader无法在IE9上工作,所以我决定使用canvas 无论如何,使用画布也会产生一个问题: SCRIPT5022:DOM异常:安全错误(18) 这是我的代码: var url="http://graph.facebook.com/1420060541/picture?width=320&height=320"; var canvas = document.createElement('CANVAS'), ctx =

我正在尝试将facebook图像转换为base64,但是FileReader无法在IE9上工作,所以我决定使用canvas

无论如何,使用画布也会产生一个问题:

SCRIPT5022:DOM异常:安全错误(18)

这是我的代码:

var url="http://graph.facebook.com/1420060541/picture?width=320&height=320";
 var canvas = document.createElement('CANVAS'),
 ctx = canvas.getContext('2d'),
 img = new Image;

 img.onload = function () {
  canvas.height = img.height;
  canvas.width = img.width;
  ctx.drawImage(img, 0, 0);
  var dataURL = canvas.toDataURL('image/jpg');
  console.log(dataURL);
  canvas = null;
};
img.setAttribute('crossOrigin','anonymous');
img.src = url;

更新

似乎facebook确实有跨源标题
访问控制允许源:“*”
允许任何人查看图像。 如果您试图加载图像时忘记添加
img.setAttribute('crossOrigin','anonymous')第二次添加它将失败,因为缓存的映像干扰了请求头。清空缓存并使用
img.setAttribute('crossOrigin','anonymous')再次发送请求这可能会解决您的问题

跨域错误。没有解决办法。图像必须来自同一个域,因此您需要将图像移动到您的域(如果有)。或者在您的计算机上设置服务器,并将映像移动到该计算机上的目录。 如果您的域是
www.privateDomain.com
,则只能通过
toDataURL
访问来自
privateDomain
的图像 如果您正在使用硬盘,即您的页面url以
file://
开头,则无法通过toDataURL访问任何图像

有些例外情况是因为某些服务器发送带有允许跨域访问的映像的标头。此类图像的一个来源是wiki commons。还有其他的,但你必须搜索它们

另一个解决方案是关闭浏览器上的网络安全(我不知道如何在IE上),但这会使您的浏览器受到攻击


令人遗憾的是,我们甚至不能信任图像,但事实就是这样。

IE团队在第11版“only has the name”浏览器之前没有实现
crossorigin
属性。你完蛋了。可能的解决方法:同一域上的服务器代理。实际上,至少从其graph API来看,FB映像提供了
访问控制允许源:
标题,因此将
交叉源
属性设置为
'anonymous'
可能有效,如果IE实现了这个功能…只要尝试一下我朋友列表中的一个图像,它就会被删除。但是找到了一个解决办法。那么这在过去两周内有没有改变?或者你说的是非图形FB图像,就像我在评论的第一个版本中所做的那样?@kaido缓存图像将失败,尽管原始请求标题设置正确。清空缓存修复了这个问题。是的,如果IE不能设置原始标题,那么是时候让他抓起一把铲子并将其掩埋了。套用道格拉斯·克罗克福德的话。“我必须死……”