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

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

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

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

Q&A

解決済

5回答

232閲覧

JavaScriptのチュートリアルが動きません

Ykkykk

総合スコア140

JavaScript

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

0グッド

0クリップ

投稿2018/08/28 00:58

編集2018/08/28 01:19

こちらのサイトにあるJavascriptのチュートリアルを行っております。
一応スクリプトを見て書いたのですが、なぜか動きません。

Javascript

1var para = document.querySelector('p'); 2var count = 0; 3 4// setup canvas 5 6var canvas = document.querySelector('canvas'); 7var ctx = canvas.getContext('2d'); 8 9var width = canvas.width = window.innerWidth; 10var height = canvas.height = window.innerHeight; 11 12// function to generate random number 13 14function random(min,max) { 15 var num = Math.floor(Math.random()*(max-min)) + min; 16 return num; 17}; 18 19function Shape(x, y, velX, velY, exists) { 20 this.x = x; 21 this.y = y; 22 this.velX = velX; 23 this.velY = velY; 24 this.exists = exists; 25}; 26 27function Ball(x, y, velX, velY, exists, color, size) { 28 Shape.call(this, x, y, velX, velY, exists); 29 30 this.color = color; 31 this.size = size; 32}; 33 34Ball.prototype = Object.create(Shape.prototype); 35Ball.prototype.constructor = Ball; 36 37Ball.prototype.draw = function() { 38 ctx.beginPath(); 39 ctx.fillStyle = this.color; 40 ctx.arc(this.x, this.y, this.size, 0, 2 * Math.PI); 41 ctx.fill(); 42}; 43 44Ball.prototype.update = function() { 45 if ((this.x + this.size) >= width) { 46 this.velX = -(this.velX); 47 } 48 49 if ((this.x - this.size) <= 0) { 50 this.velX = -(this.velX); 51 } 52 53 if ((this.y + this.size) >= height) { 54 this.velY = -(this.velY); 55 } 56 57 if ((this.y - this.size) <= 0) { 58 this.velY = -(this.velY); 59 } 60 61 this.x += this.velX; 62 this.y += this.velY; 63}; 64 65Ball.prototype.collisionDetect = function() { 66 for (var j = 0; j < balls.length; j++) { 67 if (!(this === balls[j])) { 68 var dx = this.x - balls[j].x; 69 var dy = this.y - balls[j].y; 70 var distance = Math.sqrt(dx * dx + dy * dy); 71 72 if (distance < this.size + balls[j].size) { 73 balls[j].color = this.color = 'rgb(' + random(0, 255) + ',' + random(0, 255) + ',' + random(0, 255) + ')'; 74 } 75 } 76 } 77}; 78 79function EvilCircle(x, y, exists) { 80 Shape.call(this, x, y, 20, 30, exists); 81 82 this.color = 'white'; 83 this.size = 10; 84} 85 86EvilCircle.prototype = Object.create(Shape.prototype); 87EvilCircle.prototype.constructor = EvilCircle; 88 89EvilCircle.prototype.draw = function() { 90 ctx.beginPath(); 91 ctx.strokeStyle = this.color; 92 ctx.lineWidth = 3; 93 ctx.arc(this.x, this.y, this.size, 0, 2 * Math.PI); 94 ctx.stroke(); 95}; 96 97EvilCircle.prototype.checkBounds = function() { 98 if ((this.x + this.size) >= width) { 99 this.x -= this.size; 100 } 101 102 if ((this.x - this.size) <= 0) { 103 this.x += this.size; 104 } 105 106 if ((this.y + this.size) >= height) { 107 this.y -= this.size; 108 } 109 110 if ((this.y - this.size) <= 0) { 111 this.y += this.size; 112 } 113}; 114 115EvilCircle.prototype.setControls = function() { 116 var _this = this; 117 window.onkeydown = function() { 118 if (e.keyCode === 65) { 119 _this.x -= _this.velX; 120 } else if (e.keyCode === 68) { 121 _this.x += _this.velX; 122 } else if (e.keyCode === 87) { 123 _this.y -= _this.velY; 124 } else if (e.keyCord === 83) { 125 _this.y += _this.velY; 126 } 127 }; 128}; 129 130EvilCircle.prototype.collisionDetect = function() { 131 for (var j = 0; j < balls.length; j++) { 132 if (balls[j].exists) { 133 var dx = this.x - balls[j].x; 134 var dy = this.y - balls[j].y; 135 var distance = Math.sqrt( dx * dx + dy * dy); 136 137 if (distance < this.size + balls[j].size) { 138 balls[j].exists = false; 139 count--; 140 para.textContent = 'Ball count: ' + count; 141 } 142 } 143 } 144}; 145 146 147var balls = []; 148 149function loop() { 150 ctx.fillStyle = 'rgba(0, 0, 0, 0.25)'; 151 ctx.fillRect(0, 0, width, height) 152 153 while (balls.length < 25) { 154 var size = random(10,20); 155 var ball = new Ball( 156 random(0 + size,width - size), 157 random(0 + size,height - size), 158 random(-7,7), 159 random(-7,7), 160 true, 161 'rgb(' + random(0,255) + ',' + random(0,255) + ',' + random(0,255) + ')', 162 size 163 ); 164 balls.push(ball); 165 count++; 166 para.textContent = 'Ball count: ' + count; 167 } 168 169 for (var i = 0; i < balls.length; i++) { 170 if (balls[i].exists) { 171 balls[i].draw(); 172 balls[i].update(); 173 balls[i].collisionDetect(); 174 } 175 } 176 177 evil.draw(); 178 evil.checkBounds(); 179 evil.collisionDetect(); 180 181 requestAnimationFrame(loop); 182} 183 184loop();

エラーとしては、166行目で
TypeErroe:para is null.
となっています。166行目は以下のコードです。

Javascript

1para.textContent = 'Ball count: ' + count;

こちらを読み込んでいるHTMLは以下のものになります。

HTML

1<!DOCTYPE html> 2<html> 3 <head> 4 <meta charset="utf-8"> 5 <title>Bouncing balls</title> 6 <link rel="stylesheet" href="style.css"> 7 </head> 8 9 <body> 10 <h1>bouncing balls</h1> 11 <canvas></canvas> 12 13 <script src="main.js"></script> 14 </body> 15</html>

こちらのHTMLはチュートリアルで用意されているものをコピペしております。
これはなぜ動かないのでしょうか?最初の変数を定義する箇所が間違っているということでしょうか?
ご教示くださいますと幸いです。

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

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

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

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

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

yukihisa

2018/08/28 01:16

実装しているHTMLを提示していただけませんか?これだけではなんとも言えません。
Ykkykk

2018/08/28 01:20

情報不足で申し訳ありません。追記いたしました。
m.ts10806

2018/08/28 01:20

もっと簡単なところから1つ1つ確かめながらやっていきませんか?例えばquerySelector()できちんと想定の情報が取れているか確認するとか。
Ykkykk

2018/08/28 01:24

ご意見いただきありがとうございます。大変申し訳ないのですが、それはどのように確認できるのでしょうか?
Ykkykk

2018/08/28 01:26

console.logで指定してみたところ、nullが返っておりました。
m.ts10806

2018/08/28 01:26

console.log() で変数を引数に指定してください。「JavaScript デバッグ」で検索したら沢山出てきますよ。
m.ts10806

2018/08/28 01:30

なるほど。回答の通りですね。おそらく提示されているサイトはリファレンスでもあるのでquerySelectorなどの機能を確認してみると良いです。指定情報が存在しなかったときの「返り値」がnullであればそもそも本来返るべきエレメント情報ではないわけで、textContentなどのメソッドも存在しないため使えないということになります
Ykkykk

2018/08/28 01:37

いろいろとご教示いただきありがとうございます。感謝しております。
guest

回答5

0

ベストアンサー

まず、

JavaScript

1var para = document.querySelector('p');

この最初にparaを設定している部分で<p>タグの内容を取得しています。
MDN web docs
提示のHTMLにはそもそも<p>タグがないので取得できずnullが返っているので、エラーが出ているということです。
チュートリアルそのままでは
MDNチュートリアル実行結果
となるはずなので、ボールをカウント⇒ボールの数を表示をしたいなら<p>タグを追加しないといけないですね。

投稿2018/08/28 01:31

yukihisa

総合スコア672

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

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

Ykkykk

2018/08/28 01:35

ご回答いただきありがとうございます。 quertSelectorについて理解できました。
guest

0

<p>タグを追加しましたか?

1.HTMLファイルに「Ball count:」というテキストを含む<h1>要素の直下に<p>要素を追加します。

投稿2018/08/28 01:26

macaron_xxx

総合スコア3191

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

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

0

html側にpタグが無いからでは?

投稿2018/08/28 01:24

sousuke

総合スコア3828

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

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

0

1行目、理解していますか?
var para = document.querySelector('p');
これはdocumentから<p></p>要素を探して、最初に見つけたひとつを取得します。
Document.querySelector()
見つからない場合、nullを返します。

ご提示のHTMLを見る限り、<p></p>要素は存在しません。
つまり変数paraにはnullが代入されます。

nullはプロパティを一切持ちません。
null.textContentは実行できないということです。

投稿2018/08/28 01:32

spookybird

総合スコア1803

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

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

Ykkykk

2018/08/28 01:34

ご回答いただきありがとうございます。 理解できました。
guest

0

var para = document.querySelector('p');

↑この1行は「<p>」タグの要素を取得するものです。

提示されているHTMLには「<p>」タグの要素が存在しません。

よって、

TypeErroe:para is null.

↑こうなるのです。

投稿2018/08/28 01:24

tkturbo

総合スコア5572

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

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

Ykkykk

2018/08/28 01:31

ご回答いただきありがとうございます。 HTMLに空欄の<p>タグだけを書き加えるということになるのでしょうか? 166行目が<p>タグを書き換えるのかと思っていたのですが、166行目はどのような役割を果たしているのでしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問