【发布时间】:2022-01-17 07:52:56
【问题描述】:
JS 代码 -
var canvas = document.getElementById("canvas");
var ctx = canvas.getContext("2d");
var $canvas = $("#canvas");
var BB=canvas.getBoundingClientRect();
var offsetX = BB.left;
var offsetY = BB.top;
var mx;
var my;
var texts = [];
var images = [];
var dragF = -1;
var mode = "none";
function print(log) {
console.log(log)
}
function draw() {
ctx.clearRect(0, 0, canvas.width, canvas.height);
for(const { text, x, y, width, height } of texts) {
ctx.fillText(text, x, y);
// trace
ctx.strokeRect(x, y, width, height);
}
}
function addNewText(string_text, arrayname) {
var y = texts.length * 20 + 20;
var text = {
text: string_text,
x: 20,
y: y,
name: arrayname
};
ctx.font = "32px verdana";
ctx.textBaseline = "top";
text.width = ctx.measureText(text.text).width;
text.height = 32;
texts.push(text);
draw();
}
function hitDrag(x,y,textIndex) {
var r=texts[textIndex];
return (x>r.x && x<r.x+r.width && y>r.y && y<r.y+r.height);
}
function myDown(e) {
e.preventDefault();
e.stopPropagation();
mx=parseInt(e.clientX-offsetX);
my=parseInt(e.clientY-offsetY);
for(var i=0;i<texts.length;i++){
if(hitDrag(mx,my,i)){
print("found");
dragF = i;
}
}
}
$("#canvas").mousedown(function(e) {
myDown(e);
});
addNewText("Hello world", "text 1");
所以我在 BBox 上遵循了@Kaiido 的建议,并将 textBaseline 更改为“top”。非常适合。现在,当我在我的帮助论坛下运行他的代码剪辑器时,它似乎可以工作并打印“找到”(这表明它可以工作)。当我运行它时,它似乎不起作用。这可能是什么原因。
他的代码有效:https://gyazo.com/511bf35523fcb3ea8a26c2b088530f99
我的编码不起作用:https://gyazo.com/743c38f6a33a7f1f4513bac361c23588
HTML 代码 -
<div id="middle_container">
<div class="center_container">
<canvas id="canvas"></canvas>
</div>
</div>
CSS 代码 -
#canvas {
height: 667px;
width: 800px;
touch-action: auto;
cursor: inherit;
visibility: visible;
border: 1px solid grey;
}
【问题讨论】:
-
我建议
var print = console.log;改为var myprint = function(mything){console.log(mything);};之类的,而不是重新定义window.print() -
请为您正在使用的
$("#canvas")添加 HTML -
您好,首先感谢您的帮助!数组不是空的,因为 addNewText 函数将一个对象添加到数组中。所以假设已经通过 addNewText 函数添加了对象,它仍然没有检测到点击。
-
调用那个函数 -
addNewText("charlie""delta");它是 0 长度。也许将您的问题更新为更完整的示例? -
我们需要看到
draw。从外观上看,您没有设置上下文的textBaseline,因此 BBox 的 y 轴偏离了一个行高。如果您想要一个更防弹的功能来检测画布中的文本点击:stackoverflow.com/a/67015797/3702797
标签: javascript jquery html5-canvas