[英]Drawing on a "dynamic" canvas
So I have a loop that creates canvas according to certain parameters from jquery.所以我有一个循环,根据 jquery 的某些参数创建 canvas。 Here's the code:
这是代码:
var Game = {
cards: [],
$board: $('[data-display="game-board"]'),
deal: function() {
var self = this;
var dealRequest = $.ajax({
url: 'set.php?action=deal',
type: 'GET',
dataType: 'json',
success: function(data) {
self.cards = data;
self.displayCards.call(self);
self.existingSet(data);
self.setCardListeners();
self.setPageListeners();
}
});
},
displayCards: function() {
var self = this;
$.each(this.cards, function(index, card) {
var cardNode = $('<div>');
cardNode.addClass('card');
$(cardNode).data({
'id': card.id,
'shape': card.shape,
'fill': card.fill,
'color': card.color,
'number': card.number
});
var shapeNode = $("<canvas></canvas>");
shapeNode.addClass('shape ' + card.color + ' ' + card.shape + ' ' + card.fill);
for (var i = 0; i < card.number; i++) {
cardNode.append(shapeNode.clone());
}
self.$board.append(cardNode);
// display 4 cards per row
if ((index+1) % 3 === 0) {
self.$board.append($('<div>'));
}
};
Then I try to recover from my HTML these canvas created using the name of the css classes, with something like:然后我尝试从我的 HTML 中恢复这些 canvas 使用 css 类的名称创建,类似于:
var canvases = document.getElementsByClassName('shape diamond red solid');
But when I try to draw in these canvas there is nothing displayed.但是当我尝试绘制这些 canvas 时,没有任何显示。 I do something like:
我做类似的事情:
var canvases = document.getElementsByClassName('shape red diamond solid');
for (let canvas of canvases) {
var context = canvas.getContext('2d');
drawDiamond(context, 50, 50, 75, 100);
canvas.fillStyle("#FF0000");
ctx.fillRect(0, 0, canvas.width, canvas.height);
}
But when I create a canvas statically that works.但是当我静态创建一个 canvas 时,它可以工作。
Can you please try to help me to find the problem or maybe a solution?你能帮我找到问题或解决方案吗? Thank you!
谢谢!
Would suggest the following code:建议使用以下代码:
$.each(this.cards, function(index, card) {
var cardNode = $('<div>', {
class: "card"
}).appendTo("body");
cardNode.data(card);
var shapeNode = $('<canvas>', {
class: "shape " + card.color + " " + card.shape + " " + card.fill
}).appendTo(cardNode);
});
The once that is done the following should work:一旦完成,以下应该可以工作:
var canvases = $('.shape.red.diamond.solid');
canvases.each(function(i, c) {
var context = c.getContext('2d');
drawDiamond(context, 50, 50, 75, 100);
c.fillStyle("#FF0000");
ctx.fillRect(0, 0, c.width, c.height);
});
Update更新
Consider the following.考虑以下。
var Game = { cards: [], $board: $('[data-display="game-board"]'), deal: function() { var self = this; /* $.getJSON('set.php?action=deal', function(data) { $.each(data, function(i, card) { self.cards.push(card); }); self.displayCards(); self.existingSet(data); self.setCardListeners(); self.setPageListeners(); }); */ self.cards.push({ id: "ace-spade", shape: "spade", fill: "solid", color: "black", number: 1 }); self.displayCards(); }, displayCards: function() { var self = this; if (self.cards.length == 0) { return false; } $.each(self.cards, function(index, card) { var cardNode = $('<div>', { class: "card" }).appendTo(self.$board); cardNode.data({ 'id': card.id, 'shape': card.shape, 'fill': card.fill, 'color': card.color, 'number': card.number }); for (var i = 0; i < card.number; i++) { cardNode.append($("<canvas>", { class: 'shape ' + card.color + ' ' + card.shape + ' ' + card.fill })); } self.$board.append(cardNode); // display 4 cards per row if ((index + 1) % 3 === 0) { self.$board.append($('<div>')); } }); } }; Game.deal();
.card { border: 1px solid #000; border-radius: 6px; width: 100px; height: 175px; }
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script> <div data-display="game-board"></div>
I cannot test with AJAX, so I populated the "deck" with an Ace of Spades.我无法用 AJAX 进行测试,所以我用黑桃 A 填充了“甲板”。 The resulting HTML is:
生成的 HTML 是:
<div data-display="game-board">
<div class="card">
<canvas class="shape black spade solid"></canvas>
</div>
</div>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.