【发布时间】:2015-07-18 22:05:20
【问题描述】:
我的一个界面元素正在使用 HTML5 <canvas> 元素和相关的 JavaScript API 呈现。此元素用于同一屏幕上的多个位置以及整个应用程序的多个屏幕上。在需要的任何地方显示此内容的最有效方法是什么?
我的第一个想法是绘制到主画布,然后将其克隆并插入到页面中需要的位置。主画布可能类似于:
var master = $('<canvas>').attr({
width: 100,
height: 100
}),
c = master[0],
ctx = c.getContext("2d");
ctx.fillStyle = "#FF0000";
ctx.fillRect(0, 0, 150, 75);
假设我想在这些 div 容器中复制画布:
<div class="square-container" id="square_header"></div>
...
<div class="square-container" id="square_dataTable"></div>
...
<div class="square-container" id="square_gallery"></div>
....
当页面加载时,我将在每个容器中插入一个重复的画布元素:
$(document).ready(function() {
$('.square-container').each(function() {
master.clone().appendTo($(this));
});
});
在画布上呈现的内容将比本示例中使用的简单正方形更复杂,但最终仍将只是静态图像。不过,也有可能有几十张不同的图片,每张图片每页克隆了几十次。
我想到的另一种方法是使用toDataURL() 方法创建图像并将其设置为适当的图像源:
var master = $('<canvas>').attr({
width: 100,
height: 100
}),
c = master[0],
ctx = c.getContext("2d");
ctx.fillStyle = "#FF0000";
ctx.fillRect(0,0,150,75);
var square = c.toDataURL('image/png');
我会在必要时添加图片标签:
<img src="" id="square_header" class="square" alt="" />
...
<img src="" id="square_dataTable1" class="square" alt="" />
...
<img src="" id="square_gallery" class="square" alt="" />
....
然后将他们所有的 SRC 设置为新创建的图像:
$(document).ready(function() {
$('img.square').attr('src', square);
});
对我来说,它看起来很像一个六个,另一个六个。但我想知道一种方法是否被认为比另一种更好?如果在<canvas> 上呈现的内容更复杂,那么一种方式会比另一种更有效吗?
本着同样的精神,当我需要在后续页面上使用该元素时,最好在每个页面上执行所有 javascript(从上面认为最好的任何解决方案)还是将 CANVAS_ELEMENT.toDataURL() 的值保存在cookie,然后在后续页面上使用它会更有效吗?
【问题讨论】:
标签: javascript html canvas cloning