2011-11-05 41 views
19

我使用THREE.js,并会添加材料,如以下铬,three.js所:跨源图像负荷否认

var materialWall = new materialClass({ color: 0xffffff, map: THREE.ImageUtils.loadTexture('images/a.png') }); 

它正常工作在Chrome,IE,FF,直到4天前,我将Chrome更新到最新的开发版本(17)后。

的Chrome 17只是无法正确加载图像和抱怨

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

这有点奇怪,因为图像清晰在同一个域,是怎么来的跨域的东西呢?

这是一个铬或THREE.js或我的代码的错误?

回答

12

https://github.com/mrdoob/three.js/issues/687指的是three.js'GitHub上的一个问题,它有很好的解决方法列表,其中包括a link to a wiki page describing how to run locally。也有一些其他的解决方法在线程,包括添加以下到您的脚本:

THREE.ImageUtils.crossOrigin = ""; 

或者,加入CORS标头,使它们特别允许。

请注意,大部分信息都是从已有的问题链接中添加的,而此问题的原始作者并未包含此信息。

+0

我今天仍然有这个问题 - 你知道,如果这已被修复或..?我最新...任何工作? – keyle

+0

今天修复它的最佳方法,一年多后? –

+1

请不要让你的答案只是一个链接。在你的答案中包含相关细节,以便如果链接死亡(例如,如果项目移动到另一个帐户(并且你忘记更改此链接),或者重命名,或者该特定问题被删除,或者GitHub更改其命名约定,或...)你的答案仍然有一定的价值。 –

12

如果从本地主机和使用three.js所运行Chrome,你可能需要使用此命令行标志运行Chrome浏览器:

c:// ... /chrome.exe --allow-file-access-from-files 
+4

好吧,但用户将不会运行该命令..这看起来不像一个可行的解决方案 – Julius

+1

如何申请这在Ubuntu的? – ajahongir

+1

适用于Mac:/ Applications/Google \ Chrome.app/Contents/MacOS/Google \ Chrome - 允许文件访问从文件 – ken

7

如果您:

  • 不想建立自己的服务器,并
  • 不想降级浏览器的安全

然后,我摸索出解决的办法只涉及的一点点努力:

  1. 将图像转换为Base64编码的文本
  2. 储存于外部JavaScript文件
  3. 链接到您的项目页面
  4. 加载到你的纹理可以在http://tp69.wordpress.com/2013/06/17/cors-bypass/对于那些有兴趣找到

全部细节。

0

这个工作对我来说在命令行\终端:

./chrome.exe --disable-web-security 

*请注意,您必须执行命令,它的工作之前,关闭Chrome的所有实例。

0

完美解决方案:

三人。JS:跨域图像加载否认

只需添加时间戳到图像的URL。我不知道它背后的逻辑,但它的工作原理。

例子:

var material = new THREE.MeshBasicMaterial({ 
    map: loader.load(url + "?v=" + (new Date()).toString(), function() { 
    animate(); 
    }) 
}); 
+2

这不起作用,我不知道如何防止CORS错误。它唯一防止的是缓存。你也可以更好地使用(new Date())。getTime()而不是“toString()” – belzebu

2

您还可以运行使用python通过从根文件夹运行以下命令一个简单的HTTP服务器。

python -m SimpleHTTPServer 8000