Javascript 无法使用CreateJS预加载和显示SVG

Javascript 无法使用CreateJS预加载和显示SVG,javascript,createjs,preloadjs,Javascript,Createjs,Preloadjs,我正在尝试预加载一组SVG对象,并使用CreateJS/PrelodJS显示它们。到目前为止,我能够在不预加载的情况下显示SVG对象,但只要使用PreloadJS中的LoadQueue,我就无法让我的示例正常工作 有人知道我做错了什么吗?谢谢 Javascript var imageManifest = [ { id: "MySvgImage", src: "http://dev.w3.org/SVG/tools/svgweb/samples/svg-files/check.svg" }

我正在尝试预加载一组SVG对象,并使用CreateJS/PrelodJS显示它们。到目前为止,我能够在不预加载的情况下显示SVG对象,但只要使用PreloadJS中的LoadQueue,我就无法让我的示例正常工作

有人知道我做错了什么吗?谢谢

Javascript

var imageManifest = [
  { id: "MySvgImage", src: "http://dev.w3.org/SVG/tools/svgweb/samples/svg-files/check.svg" }
];

var stage = new createjs.Stage(document.getElementById('gameCanvas'));

var assetQueue = new createjs.LoadQueue(true);
assetQueue.loadManifest(imageManifest);
assetQueue.on('complete', complete);

function complete(e) {   
    // DOESN'T WORK
    var svgImage = new createjs.Bitmap(assetQueue.getResult('MySvgImage'));    
    stage.addChild(svgImage);

    // WORKS
    var svgImage2 = new createjs.Bitmap("http://dev.w3.org/SVG/tools/svgweb/samples/svg-files/circles1.svg");
    stage.addChild(svgImage2);

    stage.update();    
    createjs.Ticker.setFPS(40);
    createjs.Ticker.addListener(tick);
}

function tick() {
    stage.update();
}
HTML

<!DOCTYPE html>

<html lang="en">
<head>
    <script src="http://code.createjs.com/createjs-2013.12.12.min.js"></script>
    <script src="http://code.createjs.com/preloadjs-0.4.1.min.js"></script>
    <script src="app.js"></script>
</head>
<body>
    <canvas id="gameCanvas" width="800" height="800"></canvas>
</body>
</html>

您的示例中存在一些问题,这些问题妨碍了资产的预加载,但不幸的是,如果这些问题得到解决,它仍然无法进入画布

开始预加载工作: 资产将需要托管在启用CORS的服务器上,以便进行跨域加载。PreloJS将使用XHR加载SVG,如果不做一些额外的工作,就无法跨域加载SVG。下面更新的示例显示了这一点

// Note: Requires very latest PreloadJS (NEXT in GitHub)
var assetQueue = new createjs.LoadQueue(true, null, true);
// 3rd parameter is "crossOrigin", and requires a CORS server.

预加载后,可以将资源附加到DOM,但不能用作EaselJS位图的源。Canvas似乎可以而不是
drawImage
与本地SVG源一起使用。它可以附加到DOM思想中

第二种方法之所以有效,是因为它自动将位图的源视为图像路径,因此它将其加载为图像(位图在传递字符串路径时在幕后创建图像)


在PreloadJS中添加基于图像的预加载可能是个好主意-我将在GitHub中添加一个问题。

我找到了简单的解决方案。只需强制PreloadJS使用图像加载程序,而不是SVGLoader

{src:"img/bg.svg", id:"bg", type: createjs.LoadQueue.IMAGE}
然后你可以转换它

var bg = new createjs.Bitmap(loader.getResult('bg'));  
stage.addChild(bg);

你好,兰尼!谢谢你提供的所有细节!我试图建立一个人们可以用来测试的样本。如果SVG文件与Javascript代码托管在同一个站点上,它能让我的示例正常工作吗?不,您不能将SVG实例传递给位图——它似乎不适用于
drawImage
。我认为会,因此值得进一步研究。您可以预加载SVG,以便在DOM中使用。我不使用CreateJS,但我对预加载程序感兴趣,所以四处看看。看到这一点,我只是想指出一个解决办法。请注意,如果您将svg绘制为这样的图像,那么svg中带有外部链接的图像标记将无法工作,您需要使用dataURL嵌入图像(显然……还没有时间尝试,更好的工作;)。这正是我寻找预加载程序的原因;)