我正在尝试制作一个 webapp(使用 Impact js 游戏引擎开发),能够在不需要本地主机(使用 file:///C:/...)的情况下在本地运行,并且我需要让它在 chrome 上运行.
它在 chrome 上不起作用的主要问题是,由于 CORS 问题,chrome 会阻止我的媒体(主要是 png/jpg 中的图像)从媒体文件夹中加载。
在花了几天时间阅读并尝试了一些方法后,我无法解决这个问题。任何有这方面经验的人请告诉我是否可能,如果可能,我应该采取什么方法。
我尝试过的方法:
1) 设置 img.crossOrigin = "anonymous" (失败,这仍然被 chrome 屏蔽)
2)使用标志打开chrome --allow-file-access-from-files(有效,但对最终用户来说不是可行的方法)
3) 读取图像并将其转换为数据 uri 格式(失败,由于固有的 COR 问题,数据 uri 转换似乎无法正常工作)
4) 尝试使用 appcache 将所有图像缓存到浏览器缓存中(失败,似乎不起作用,因为它没有从网络服务器访问)
更新:我现在正在尝试编辑 Impact.image 源代码,以尝试在加载到图像时将 src 转换为数据 url
load: function( loadCallback ) {
function getBase64Image(img) {
// Create an empty canvas element
var img2 = document.createElement("img");
var canvas2 = document.createElement("canvas");
// Copy the image contents to the canvas
var ctx2 = canvas2.getContext("2d");
img2.onload = function(){
canvas2.width = img2.width;
canvas2.height = img2.height;
};
img2.onerror = function() {console.log("Image failed!");};
img2.src = img + '?' + Date.now();
ctx2.drawImage(img2, 0, 0, img2.width, img2.height);
return canvas2.toDataURL("image/png");
}
if( this.loaded ) {
if( loadCallback ) {
loadCallback( this.path, true );
}
return;
}
else if( !this.loaded && ig.ready ) {
this.loadCallback = loadCallback || null;
this.data = new Image();
this.data.onload = this.onload.bind(this);
this.data.onerror = this.onerror.bind(this);
//this.data.src = ig.prefix + this.path + ig.nocache;
//old src sets to local file, new src sets to data url generated
this.data.src = getBase64Image(this.path);
}
else {
ig.addResource( this );
}
ig.Image.cache[this.path] = this;
},
由于某种原因,图像没有被加载到函数中,即使我将图像加载加载到 getBase64Image 函数中,它会起作用吗?