多分こんな感じではないでしょうか。
How do I check if a mouse click is inside a rotated text on the HTML5 Canvas in JavaScript?やHTML Canvas Hover Textを参考にしました。
実装が面倒で質問の本質ではないと思ったので、以下の例ではマウスがテキスト上で移動するとコンソールにテキストを表示するようにしています。開発者ツールで確認してください。
canvasは結局の所ペイントみたいな上書き仕様なので、canvas内に新たなテキストなどを表示・非表示をしたい場合、「上書き→すべて消す→下のものを再描画」という手順を踏むか、canvasの上に別のcanvasを重ねておき、吹き出しなどはそちらに描画するようにする、などの方法を取る必要があります。
また今回はわかりやすさ重視でなるべく単純な感じに書いてますが、理解ができるならクラス(HTMLではなくjsの)を用いた設計をするといい感じになると思います。
html
1<canvas id="canvas" width=300 height=300></canvas>
2<script src="script.js"></script>
js
1function getTextRectPath(ctx, text, textX, textY) {
2 // テキスト描画時の範囲情報TextMatrixから、テキスト背景の矩形パスを生成して返す
3 const tm = ctx.measureText(text);
4 const x = textX - tm.actualBoundingBoxLeft;
5 const y = textY - tm.actualBoundingBoxAscent;
6 const width = tm.width;
7 const height = tm.actualBoundingBoxAscent + tm.actualBoundingBoxDescent;
8 const path = new Path2D();
9 path.rect(x, y, width, height);
10 return path;
11}
12
13const canvas = document.getElementById('canvas');
14const ctx = canvas.getContext('2d');
15ctx.textAlign = "center";
16ctx.textBaseline = "middle";
17ctx.font = "60px Arial";
18
19const textList = [
20 //各テキストの情報をまとめたオブジェクトの配列
21 {text: 'text1', x: 100, y: 200, path: null},
22 {text: 'text2', x: 200, y: 100, path: null}
23];
24
25for (const t of textList) {
26 // テキスト背景の矩形パスを得てpathに代入
27 t.path = getTextRectPath(ctx, t.text, t.x, t.y);
28 // わかりやすさのため矩形を塗りつぶす(やらなくてもいい)
29 ctx.fillStyle = 'red';
30 ctx.fill(t.path);
31 // テキストを描画する
32 ctx.fillStyle = 'black';
33 ctx.fillText(t.text, t.x, t.y);
34}
35
36canvas.addEventListener('mousemove', e => {
37 // canvas上でマウスが動くと呼び出される関数
38 const canvas = e.currentTarget;
39 // canvasの左辺・上辺を得る
40 const rect = canvas.getBoundingClientRect();
41 const offsetX = rect.left;
42 const offsetY = rect.top;
43 // ページ全体上の座標(clienet~)↑からcanvas上のマウス座標を得る
44 const x = e.clientX - offsetX;
45 const y = e.clientY - offsetY;
46 for (const t of textList) {
47 // textListの各テキストについて、矩形パス上にマウスがあるか確認する
48 if (ctx.isPointInStroke(t.path, x, y)) {
49 console.log(t.text);
50 }
51 }
52});