【发布时间】:2015-06-20 12:22:13
【问题描述】:
在将 html 元素中的所有 svg 转换为画布后,我正在尝试使用 html2canvas 发布,但该帖子在 svg 到画布转换完成之前立即执行,因为它需要几秒钟。我尝试过使用 deferred 和 Promise,但我仍然遇到同样的问题。
// 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() {...});
已编辑:这是我一直在尝试实现的延迟和承诺,以创建两个按顺序运行的操作。
$(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
【问题讨论】:
-
可以包含
html, "post"js"我在将 svgs 转换为画布后尝试运行 post,但在转换完成之前立即执行 post" ?elementsjQuery object 或array的预期返回值是什么?可以创建stacksn-ps blog.stackoverflow.com/2014/09/… , jsfiddle jsfiddle.net 来演示吗? -
代码是异步的,所以你需要使用回调/承诺。你说你尝试过承诺,你能展示一下代码吗?
-
@Ken Fyrstenberg 我已经更新了我迄今为止尝试过的承诺。
标签: javascript jquery canvas svg html2canvas