Javascript fabricjs还是slimerjs,“显示所有对象”事件?

Javascript fabricjs还是slimerjs,“显示所有对象”事件?,javascript,image,canvas,phantomjs,fabricjs,Javascript,Image,Canvas,Phantomjs,Fabricjs,我正在使用slimerjs来呈现一些html文件。每个文件都包含一个JSON字符串,该字符串通过调用 fabricjsCanvas.loadFromJson(jsonString, fabricjsCanvas.renderAll.bind(fabricjsCanvas)); 这是我打开页面的地方 page.open(address, function (status) { if (status !== 'success') { console.log('Unable

我正在使用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毫秒,所以这对性能不好,甚至不是一个安全的解决方案,因为页面渲染需要很长时间。我尝试在canvas.renderAll调用的末尾放一个console.log,然后将这段代码添加到我的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);
    }
});
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);
    }
});
我希望这会有所帮助,但没有什么真正的改变,在显示所有对象之前,重新命名将完成。 是否有一些事件我可以抓住,或者我可以做些什么来防止这种情况

您应该使用回调页。onLoadFinished


这个函数在完整上传页面后运行

我设法找到了一个解决方案。首先,我更改了我的html模板,因为我只需要渲染每页,所以我使用了StaticCanvas而不是普通的canvas。由于静态画布只有两个帧来渲染顶部的一个和第二个容器,至少这是我在经验中学到的,我在after:render event上添加了一个事件列表器,所以在渲染第二个帧后,我打印一条控制台消息,此时调用page.onsolemessage并关闭幻影进程。 通过这种方式,我不需要允许一个标准的时间量,可能是太多失去性能或不够,图像将导致空白。 这是我的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 (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);
    }
});
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);
    }
});

我把这个放在这儿,以防有人需要

我尝试使用onLoadFinished,但是当触发此事件时,画布仍然没有在页面上完成绘制。