質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

1回答

760閲覧

【Javascript】ペイントソフトを再現する上での不具合

flandre

総合スコア10

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

0クリップ

投稿2021/09/18 11:31

編集2021/09/18 13:37

ペイントっぽいコードを作ろうしたのですが
左クリックが押された地点を始点にして、そこからドラッグして線を引く仕様なのに、何故か右クリックが押された地点も始点になってしまいます
「左クリックのときのみ」としっかり指定したはずなのですが…

HTML

1<!DOCTYPE html> 2<html lang="ja"> 3<head> 4 <meta charset="utf-8"> 5</head> 6<body> 7 <canvas></canvas> 8 <script src="js/main.js"></script> 9</body> 10</html>

Javascript

1const canvas = document.querySelector('canvas'); 2const ctx = canvas.getContext("2d"); 3 4ctx.rect(0, 0, canvas.width, canvas.height); 5ctx.fillStyle = "#000"; 6ctx.fill(); 7 8ctx.lineWidth = 5; 9ctx.strokeStyle = "#fff"; 10 11let mouse = {x: 0, y: 0}; 12 13canvas.addEventListener("mousemove", function(e) { 14 mouse.x = e.pageX - this.offsetLeft; 15 mouse.y = e.pageY - this.offsetTop; 16}, false); 17 18canvas.addEventListener("mousedown", function(e) { 19 if (e.button === 0) {//左クリックのときのみに指定 20 ctx.beginPath(); 21 ctx.moveTo(mouse.x, mouse.y); 22 23 canvas.addEventListener("mousemove", onPaint, false); 24 } 25}, false); 26 27canvas.addEventListener("mouseup", function() { 28 canvas.removeEventListener("mousemove", onPaint, false); 29}) 30 31const onPaint = function() { 32 ctx.lineTo(mouse.x, mouse.y); 33 ctx.stroke(); 34}

どうか原因を教えていただきたいです

[追記]
不具合の具体的な画像を載せさせていただきます
イメージ説明
イメージ説明

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2021/09/18 11:57

動作確認しているブラウザはなんですか? macOSのChrome(93.0.4577.82)やSafari(14.1.2)ではきちんと左クリック・ドラッグで描画でき、右クリックでコンテキストメニューがでます。 `<body oncontextmenu="return false;">` でコンテキストメニューを無効化して `if (e.button === 2)` のように右クリック・ドラッグに切り替えると右だけで描画できますし(もちろん左クリック・ドラッグは無視されて描画されないようになっている)。特に問題ないように見えます。
flandre

2021/09/18 13:33

返信が遅れてしまい申し訳ありません ブラウザはwindows上のChromeです 説明が余りにも言葉足らずだったので、不具合の具体的なイメージ画像を質問に追記しておきました
退会済みユーザー

退会済みユーザー

2021/09/18 13:37 編集

なるほど!再現しました!(解決方法はまだわからない) シークレットウィンドウでも再現できるのでマウスジェスチャ系の拡張機能の仕業でもなし。
退会済みユーザー

退会済みユーザー

2021/09/18 13:40

とりあえず `<canvas oncontextmenu="return false;">` でキャンバス上でのコンテキストメニューを無効化するとマシになると思うのですが、コンテキストメニュー必須ですか?
flandre

2021/09/18 13:54

どうしてもコンテキストメニューを使わざるを得ないです…お手数おかけしてしまってすみません
guest

回答1

0

ベストアンサー

コンテキストメニュー必須となると、

js

1canvas.addEventListener("mousemove", function(e) { 2 if (e.button != 0) { 3 return 4 } 5 mouse.x = e.pageX - this.offsetLeft; 6 mouse.y = e.pageY - this.offsetTop; 7}, false);

こんな感じで、mousemove でもボタン判定を入れるしかないですかねえ。二度手間な感じがしますが…………。

投稿2021/09/18 13:59

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

flandre

2021/09/18 14:15

回答ありがとうございます ただ同じようにやってみたのですが、不具合を解消できませんでした…自分が何かやり方を間違えてるんでしょうか ↓以下コードです const canvas = document.querySelector('canvas'); const ctx = canvas.getContext("2d"); ctx.rect(0, 0, canvas.width, canvas.height); ctx.fillStyle = "#000"; ctx.fill(); ctx.lineWidth = 5; ctx.strokeStyle = "#fff"; let mouse = {x: 0, y: 0}; canvas.addEventListener("mousemove", function(e) { if (e.button != 0) { return; } mouse.x = e.pageX - this.offsetLeft; mouse.y = e.pageY - this.offsetTop; }, false); canvas.addEventListener("mousedown", function(e) { if (e.button === 0) {//左クリックのときのみに指定 ctx.beginPath(); ctx.moveTo(mouse.x, mouse.y); canvas.addEventListener("mousemove", onPaint, false); } }, false); canvas.addEventListener("mouseup", function() { canvas.removeEventListener("mousemove", onPaint, false); }) const onPaint = function() { ctx.lineTo(mouse.x, mouse.y); ctx.stroke(); }
退会済みユーザー

退会済みユーザー

2021/09/18 14:41

うちでは古いコードの方でも再現しなくなってしまいました。謎です。お役に立てず申し訳ない。
flandre

2021/09/18 14:55

とんでもないです!お力添えいただけて凄く嬉しかったです 親切に対応して下さってありがとうございました
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問