gpt4 book ai didi

jquery - 在 Handlebars 模板中使用 Canvas ?

转载 作者:行者123 更新时间:2023-12-01 07:15:49 25 4
gpt4 key购买 nike

插入 <canvas> 的最佳方式是什么?绘制到 Handlebars 模板中?请参阅下面的示例。我的第一次尝试是 canvas-inline辅助函数,它使用 JavaScsript 创建一个 Canvas 对象,然后返回它。遗憾的是,我在模板中看到的只是“[object HTMLCanvasElement]”。 Handlebars 需要 HTML 文本字符串!

所以,我的第一个问题是:有没有办法将现成的 DOM 对象返回给 Handlebars 对象?如果不是,这是一个简单的破解,还是完全违背了 Handlebars 的工作方式?

我的第二次尝试是canvas-timer辅助功能。这只是返回 <canvas>字符串,但随后使用 100 毫秒超时来添加 Canvas 内容。这可行,但我不喜欢 Fragility 先生现在加入团队(穿着他的“I Love Magic Numbers”T 恤)。

那么,如果我的前两个问题的答案是“否”和“否”,是否有一个好的方法来使用后一种方法,但摆脱计时器和任意 100 毫秒的猜测? IE。因此 Javascript 代码将在 <canvas> 时运行元素出现,不是之前,不是之后。注意:我想要将一些东西封装在辅助函数中。

在这里摆弄:http://jsfiddle.net/HCQSt/

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Handlebars: canvas test</title>
<script src="js/jquery-1.10.2.js"></script>
<script src="js/handlebars.js"></script>

<!--- ******************** TEMPLATES ******************** -->

<script id="test-template" type="text/x-handlebars-template">
<h3>Hello {{world}}</h3>
{{{canvas-inline col}}}
{{{canvas-timer col}}}
</script>

<!--- ******************** ************ ******************** -->

<script language="javascript">
Handlebars.registerHelper("canvas-inline", function(col) {
var canvas = document.createElement('canvas');
if(canvas){
console.log(canvas);
canvas.width=128;canvas.height=128;
var ctx = canvas.getContext('2d');
ctx.fillStyle = col;
ctx.fillRect(0,80,128,16);
ctx.fillRect(16,0,32,32);
ctx.fillRect(80,0,32,32);
}
else console.log("no canvas object");
return canvas;
});

Handlebars.registerHelper("canvas-timer", function(col) {
setTimeout(function(){
//var canvas = document.createElement('canvas');
var canvas = $('#xxx')[0];
if(canvas){
console.log(canvas);
canvas.width=128;canvas.height=128;
var ctx = canvas.getContext('2d');
ctx.fillStyle = col;
ctx.fillRect(0,80,128,16);
ctx.fillRect(16,0,32,32);
ctx.fillRect(80,0,32,32);
}
else console.log("no canvas object");
},100);
return '<canvas id="xxx"></canvas>';
});


var T=Handlebars.compile ( $("#test-template").html() );

$(function(){ //onReady
var obj={ world:"Blue-Green Planet", col:"#f33" };
$('<div class="view" id="test1">').append(T(obj)).appendTo('#views');
});
</script>

</head>
<body>
<h1>Handlebars: canvas test</h1>

<div id="views"></div>

</body>
</html>

附注如果您的问题是“您为什么要这样做?”,我的答案是“二维码”。提供给模板的 URL 的 QR 码。 (在这种特殊情况下,我有一个表解决方法,但我确信情况并非总是如此。)

最佳答案

帮助程序主要用于生成 View 中的内容,因此当触发帮助程序时,这是在将 View 插入页面之前。当您的助手依赖于现有的 View 元素时,您会遇到计时问题。 (这就是你的神奇超时起作用的原因)。

另一种方法是使用图像而不是 Canvas ,并让助手生成数据 url。

fiddle :http://jsfiddle.net/gwwar/L7TqJ/2/

<script id="test-template" type="text/x-handlebars-template">
<h3>Hello {{world}}</h3>
<img src="{{{generateQRCode col}}}"/>
</script>


Handlebars.registerHelper("generateQRCode", function (col) {
var canvas = window.document.createElement("canvas");
canvas.width = 128;
canvas.height = 128;
var ctx = canvas.getContext('2d');
ctx.fillStyle = col;
ctx.fillRect(0, 80, 128, 16);
ctx.fillRect(16, 0, 32, 32);
ctx.fillRect(80, 0, 32, 32);
return canvas.toDataURL();
});

var T = Handlebars.compile($("#test-template").html());

$(function () { //onReady
var obj = {
world: "Blue-Green Planet",
col: "green"
};
$('<div class="view" id="test1">').append(T(obj)).appendTo('#views');
});

觉得这还是太乱了吗?

您可能还想尝试使用 ember,它的 View 层使用 Handlebars ,并且在插入 View 时也会触发事件。

编辑:我意识到我提出的解决方案之一可以放入助手中。

关于jquery - 在 Handlebars 模板中使用 Canvas ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19017512/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com