fabricjs 或 slimerjs,"all objects displayed" 事件?

fabricjs or slimerjs, "all objects displayed" event?

我正在使用 slimerjs 渲染一些 html 文件。每个文件都包含一个 JSON 字符串,通过调用

加载该字符串
fabricjsCanvas.loadFromJson(jsonString, fabricjsCanvas.renderAll.bind(fabricjsCanvas));

这是我打开页面的地方

page.open(address, function (status) {
    if (status !== 'success') {
        console.log('Unable to load the page!');
        phantom.exit(1);
    } else {
        page.render(output);
        window.setTimeout(function () {
            page.render(output);
            phantom.exit();
        }, 5000);
    }
});

如您所见,我必须设置一个超时时间,之后 slimerjs 会关闭页面以保存其中的内容。我真的不喜欢这个解决方案,因为我需要渲染多个页面,其中一些非常小,可能需要不到 200 毫秒,其他的很大,可能需要超过 5000 毫秒,所以这对性能和甚至不是 "safe solution" 反对页面需要很长时间来呈现。我尝试将 console.log 放在 canvas.renderAll 调用的末尾,然后将这段代码添加到我的 slimerjs 脚本

 page.onConsoleMessage = function (msg) {
    console.log(msg);
    page.render(output);
    phantom.exit();
};page.open(address, function (status) {
    if (status !== 'success') {
        console.log('Unable to load the address!');
        phantom.exit(1);
    }
});

我希望这会有所帮助,但没有真正改变,reanderAll 在显示所有对象之前完成。 有没有我可以捕捉到的事件,或者我可以做些什么来防止这种情况发生?

您应该使用回调 page.onLoadFinished()

page.onLoadFinished = function(status, url, isFrame) {
    console.log('Loading of '+url+' is a '+ status);
    page.render();
};

完整上传页面后运行此功能

我设法找到了解决方案。首先,我更改了我的 html 模板,因为我只需要渲染每页我使用了 StaticCanvas 而不是普通的 canvas。由于静态 canvas 只有 2 帧要渲染(最上面的一个和第二个容器,至少这是我从经验中学到的)我在 after:render 事件上添加了一个事件列表器,所以在渲染第二帧后,我打印一条控制台消息,此时 page.onConsoleMessage 被调用并关闭幻影进程。 通过这种方式,我不需要允许可能过多(性能下降)或不足(并且图像会导致空白)的标准时间量。 这是我的 html 模板

中的脚本
 var framesRendered = 0;
    var canvas = new fabric.StaticCanvas('canvas', {width: {{width}}, height: {{height}} });
    canvas.setZoom({{{zoom}}});
    canvas.on('after:render', function() {
        if(framesRendered == 1)
            console.log('render complete');
        else framesRendered++;
    });
    canvas.loadFromJSON({{{data}}}, canvas.renderAll.bind(canvas), function (o, object) {
        if (object.type === 'picturebox' && object.filters.length) {
            object.applyFilters(function () {
                canvas.renderAll();
            });
        }
    });

这是我的 slimerjs 脚本

page.onConsoleMessage = function(){
    page.render(output);
    phantom.exit();
};
page.open(address, function (status) {
    if (status !== 'success') {
        console.log('Unable to load the address!');
        phantom.exit(1);
    }
});

我会把这个留在这里以备不时之需。