svg到canvas转换完成后如何立即发布? [英] How to post immediately after svg to canvas conversion is done?

查看:77
本文介绍了svg到canvas转换完成后如何立即发布?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在将html元素中的所有svg转换为canvas之后,我尝试使用html2canvas进行发布,但是该帖子会在svg到画布的转换完成之前立即执行.我曾尝试使用延期和承诺,但仍然遇到同样的问题.

I am attempting post with html2canvas after converting all the svgs in a html element to canvas, but the post executes immediately before the svg to canvas conversion finishes, since it takes a few seconds. I have tried using deferred and promises, but I am still having the same issue.

    // https://github.com/niklasvh/html2canvas/issues/95#issuecomment-45114424
    // First render all SVGs to canvases
    targetElem = $('#dashboard');

    var elements = targetElem.find('svg').map(function() {
        var svg = $(this);
        var canvas = $('<canvas></canvas>');
        svg.replaceWith(canvas);

        // Get the raw SVG string and curate it
        var content = svg.wrap('<p></p>').parent().html();
        content = content.replace(/xlink:title='hide\/show'/g, '');
        content = encodeURIComponent(content);
        svg.unwrap();

        // Create an image from the svg
        var image = new Image();
        image.src = 'data:image/svg+xml,' + content;
        image.onload = function() {
            canvas[0].width = image.width;
            canvas[0].height = image.height;

            // Render the image to the canvas
            var context = canvas[0].getContext('2d');
            context.drawImage(image, 0, 0);
        };

        return {
            svg: svg,
            canvas: canvas
        };
    }); // end of targetElem.find('svg').map(function() {...});

已编辑:这是我一直试图实现的创建两个顺序运行的操作的延迟和承诺.

EDITED: Here is the deferred and promise I have been attempting to implement to create two operations that run in sequential order.

$(document).ready(function() {

    $( '#save_dashboard' ).click(function() {

    // Create a deferred object
    var dfd = $.Deferred();

        // https://github.com/niklasvh/html2canvas/issues/95#issuecomment-45114424
        // First render all SVGs to canvases
        targetElem = $('#dashboard');

        var elements = targetElem.find('svg').map(function() {
            var svg = $(this);
            var canvas = $('<canvas></canvas>');
            svg.replaceWith(canvas);

            // Get the raw SVG string and curate it
            var content = svg.wrap('<p></p>').parent().html();
            content = content.replace(/xlink:title='hide\/show'/g, '');
            content = encodeURIComponent(content);
            svg.unwrap();

            // Create an image from the svg
            var image = new Image();
            image.src = 'data:image/svg+xml,' + content;
            image.onload = function() {
                canvas[0].width = image.width;
                canvas[0].height = image.height;

                // Render the image to the canvas
                var context = canvas[0].getContext('2d');
                context.drawImage(image, 0, 0);
            };
            dfd.resolve();

            return dfd.promise();
            };
        }); // end of targetElem.find('svg').map(function() {...});

        dfd.resolve();

        $.when(dfd).done(function(){
            console.log('dfd done');

            // http://www.kubilayerdogan.net/html2canvas-take-screenshot-of-web-page-and-save-it-to-server-javascript-and-php/
            $('#dashboard').html2canvas({
                onrendered: function (canvas) {
                    //Set hidden field's value to image data (base-64 string)
                    var dashboardPng = canvas.toDataURL('image/png');
                    console.log('dashboardPng: ' + dashboardPng);

                    $.ajax({
                        url:'save_dashboard_image.php',
                        data:{dashboardPngData: dashboardPng},
                        type:'POST',
                        dataType:'json',
                        success: function(){
                            console.log('success');
                        }
                        ,
                        error: function(xhr, status, error){
                            console.log('The requested page was: ' + document.URL +
                                '. The error number returned was: ' + xhr.status +
                                '. The error message was: ' + error);
                        }
                    });
                }
            });
        }); // end of $.when(dfd).done(...)
    }); // end of save_dashboard click function
}); // end of document ready

推荐答案

已更新

注意,未经测试.调整了click事件,以将多个canvas,promise对象返回给.then()

Note, Untested. Adjusted click event to return multiple canvas , promise objects , to .then()

如果正确解释问题,请尝试

If interpret question correctly, try

$(document).ready(function() {

    $( '#save_dashboard' ).click(function() {

    // Create a deferred object
    // dfd = new $.Deferred();

        // https://github.com/niklasvh/html2canvas/issues/95#issuecomment-45114424
        // First render all SVGs to canvases
        targetElem = $('#dashboard');
        var promises = $.when.apply(targetElem, $.map(targetElem.find('svg')
          , function(el, index) {
            return new $.Deferred(function(dfd) {
              var svg = $(el);
              var canvas = $('<canvas></canvas>');
              svg.replaceWith(canvas);

              // Get the raw SVG string and curate it
              var content = svg.wrap('<p></p>').parent().html();
              content = content.replace(/xlink:title='hide\/show'/g, '');
              content = encodeURIComponent(content);
              svg.unwrap();

              // Create an image from the svg
              var image = new Image();

              image.onload = function() {
                  canvas[0].width = image.width;
                  canvas[0].height = image.height;

                  // Render the image to the canvas
                  var context = canvas[0].getContext('2d');

                  dfd.resolve(context.drawImage(image, 0, 0));
              };
              image.src = 'data:image/svg+xml,' + content;
            }).promise();          
          })
         ); // end of targetElem.find('svg').map(function() {...});



        promises.then(function(_canvas) {
            console.log('dfd done', _canvas, arguments);

            // http://www.kubilayerdogan.net/html2canvas-take-screenshot-of-web-page-and-save-it-to-server-javascript-and-php/
            $('#dashboard').html2canvas({
                onrendered: function (canvas) {
                    //Set hidden field's value to image data (base-64 string)
                    var dashboardPng = canvas.toDataURL('image/png');
                    console.log('dashboardPng: ' + dashboardPng);

                    $.ajax({
                        url:'save_dashboard_image.php',
                        data:{dashboardPngData: dashboardPng},
                        type:'POST',
                        dataType:'json',
                        success: function(){
                            console.log('success');
                        }
                        ,
                        error: function(xhr, status, error){
                            console.log('The requested page was: ' + document.URL +
                                '. The error number returned was: ' + xhr.status +
                                '. The error message was: ' + error);
                        }
                    });
                }
            });
        }); // end of $.when(dfd).done(...)
    }); // end of save_dashboard click function
}); // end of document 

这篇关于svg到canvas转换完成后如何立即发布?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆