【问题标题】:FabricJs Multiple Canvases Load Same Image Multiple TimesFabricJs 多个画布多次加载相同的图像
【发布时间】:2018-03-16 14:25:16
【问题描述】:

我有一个 1-2 的循环,在循环内我在屏幕上创建了 2 个画布并将它们存储在一个对象中,然后在每个画布上加载相同的 2 个图像,但图像只出现在最后一个画布上.为什么它没有加载到两个画布上?还有一个文本对象在同一个循环中的两个画布上工作。

示例代码,它实际上只是将图像添加到屏幕上的第二个画布并忽略第一个画布,但将文本对象添加到两者?

var canvases = {};
var imageUrls = ['url here','url 2 here'];
for(var p = 1; p <= 2; p++){
    canvases[p] = new fabric.Canvas('canvas-element-'+p);
    var t = new fabric.Text('Testing',{top:600,left:0});
    canvases[p].add(t);
    canvases[p].renderAll();
    for(var i in imageUrls){
        fabric.Image.fromUrl(imageUrls[i],function(img){
            img.set({
                width:500,
                height:500,
                top:0,
                left:0
            });
            canvases[p].add(img);
            canvases[p].renderAll();
        }
    });
}

【问题讨论】:

    标签: javascript fabricjs


    【解决方案1】:
    1. imageUrls 数组包含您在 1 和 2 访问的 0 和 1 位置的图像。
    2. fabric.Image.fromUrl函数名是fabric.Image.fromURL

    3. 因为它是一个加载图像是异步函数,你需要保持在一个自调用函数中,或者只是在 for 循环中使用 let for (let p = 1; p &lt;= 2; p++) {

    var canvases = {};
    var imageUrls = ['', 'https://via.placeholder.com/300x300?text=canvas1', 'https://via.placeholder.com/300x300?text=canvas2'];
    for (var p = 1; p <= 2; p++) {
      canvases[p] = new fabric.Canvas('canvas-element-' + p);
      var t = new fabric.Text('Testing', {
        top: 600,
        left: 0
      });
      canvases[p].add(t);
      canvases[p].renderAll();
      (function(index) {
        fabric.Image.fromURL(imageUrls[p], function(img) {
          img.set({
            width: 500,
            height: 500,
            top: 0,
            left: 0
          });
          canvases[index].add(img);
          canvases[index].renderAll();
        });
      })(p);
    }
    canvas{
     border :2px solid #000
    }
    <script src="https://rawgit.com/kangax/fabric.js/master/dist/fabric.js"></script>
    <canvas id='canvas-element-1' width=300 height=300></canvas>
    <canvas id='canvas-element-2' width=300 height=300></canvas>

    【讨论】:

    • 非常感谢,我没有意识到来自 url 的加载是异步的,我的错。还有你提到的循环1和3,我知道这个,代码是来自更广泛代码的sn-p,所以你可以忽略那个不相关的循环。感谢您的回答。
    猜你喜欢
    • 2020-05-06
    • 2016-12-20
    • 2017-05-09
    • 2018-11-13
    • 2015-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多