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

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

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

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

解決済

2回答

809閲覧

html+javascriptで電卓作成 =を二度押さないと動作しない

hakusa.ppl

総合スコア21

JavaScript

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

0クリップ

投稿2019/08/01 06:03

編集2019/08/01 06:15

先ほど質問させていただき、= 自体は正常に動作したのですが、二回押さないと反応しません
なぜでしょうか?

javascript

1function den_equal() { 2 ans = eval(ans + kigou + num); //=ボタンを押すとこの計算が動く 3 document.getElementById("out").innerHTML = ans; 4 document.getElementById("type").innerHTML = ""; 5}

html+javascript

html

1<!DOCTYPE HTML> 2<html> 3<head> 4<meta charset="utf-8"> 5<title>電卓</title> 6</head> 7<body> 8<h1>電卓</h1> 9<hr> 10 11<form name="name"> 12<th colspan="3" align="right"><div id="out">0</div></th> 13<th><div id="type"></div></th> 14 15</form> 16 17<form name="den"> 18<table boder="2"> 19 20<tb><input type="button" value="" onClick="den_run(7)"></tb> 21<tb><input type="button" value="" onClick="den_run(8)"></tb> 22<tb><input type="button" value="" onClick="den_run(9)"></tb> 23<br> 24<tb><input type="button" value="" onClick="den_run(4)"></tb> 25<tb><input type="button" value="" onClick="den_run(5)"></tb> 26<tb><input type="button" value="" onClick="den_run(6)"></tb> 27<br> 28<tb><input type="button" value="" onClick="den_run(1)"></tb> 29<tb><input type="button" value="" onClick="den_run(2)"></tb> 30<tb><input type="button" value="" onClick="den_run(3)"></tb> 31<br> 32<tb><input type="button" value="" onClick="den_run(0)"></tb> 33<tb><input type="button" value="" onClick="den_run('+')"></tb> 34<tb><input type="button" value="" onClick="den_run('-')"></tb> 35<br> 36<tb><input type="button" value="" onClick="den_run('*')"></tb> 37<tb><input type="button" value="" onClick="den_run('/')"></tb> 38<tb><input type="button" value="" onClick="den_clear('C')"></tb> 39<br> 40<tb><input type="button" value="" onClick="den_period('.')"></tb> 41<tb><input type="button" value="" onClick="den_equal('=')"></tb> 42 </table> 43</form> 44 45<script language="javascript"> 46ans = 0; //計算中の数字 47num = "0"; //押された数字キーを順番に表示 48Key = ""; //1つ前に押されたキーの記録 49kigou = ""; //数字かいくつか押された後記号キーの把握 50 51 52function den_run(btn) { //変数btnでキーからの情報を受けとる 53 if(!isNaN(btn)){ //数値か記号かで分岐 54 55 if(!isNaN(Key)) { //前に押されたキーは 56 if (num == "0") { //numが0の時 57 num = ""+btn; //キーからの情報 58 } else { 59 60   num += ""+btn; //真 連続して数字が押された場合 61 } 62 } else { 63 num = ""+btn; //偽 記号の後数字、数値を文字列 64 } 65 document.getElementById("out").innerHTML = num;  //outの中身をnumへ 66 }else{ 67 if(!isNaN(Key)) { 68 69 } 70 kigou = btn; //記号を受け取ったらbtnから記号へ 71 document.getElementById("type").innerHTML = kigou; //記号が記録そのまま画面 72 } 73 Key = btn; //直前のキーは何か 74} 75function den_period() { 76 if (num.indexOf(".")<0) num +="."; //0より小さいときnumに.をプラスする。 77 document.getElementById("out").innerHTML = num; //outの内容書き換え 78} 79 80function den_clear() { 81 ans = 0; //計算中の数字消去 82 Key = ""; //1つ前の押されたキー削除 83 num = "0"; //押されたキー削除 84 kigou = ""; //記号キー削除 85 document.getElementById("out").innerHTML = num; 86 document.getElementById("type").innerHTML = kigou; 87} 88 89function den_equal() { 90 ans = eval(ans + kigou + num); //=ボタンを押すとこの計算が動く 91 document.getElementById("out").innerHTML = ans; 92 document.getElementById("type").innerHTML = ""; 93} 94 95 96</script> 97 98 99</body> 100</html>

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

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

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

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

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

m.ts10806

2019/08/01 06:11

前にも書きましたが、対応されていないので再掲 >> HTMLはDOCTYPE 宣言入れるのでしたらbodyもhtmlも閉じタグまできちんと入れてください。
m.ts10806

2019/08/01 06:12

と思ったらそっちか。。。 HTML内に全部あるのでしたらコードブロックわけなくて良いですよ。 ただ 頭の script , < がないですけど。
hakusa.ppl

2019/08/01 06:12

すいません、説明不足で javascriptのコードのほうで閉じてあります。
m.ts10806

2019/08/01 06:14

もう1個問題ありますね <tb> というタグはないです。
hakusa.ppl

2019/08/01 06:14

すいません、追加しました。
m.ts10806

2019/08/01 06:14

HTML構文が正しくないとJavaScriptやCSSも正しく動かなくなる要因になります。
hakusa.ppl

2019/08/01 06:21

<tb>タグでボタンが横に並んでいるのではないのですか?
moredeep

2019/08/01 06:38

<tb>ではなく<td>かと。それも、<tr>の下にないとダメですし、inputタグはtableの直下には入りません。 一度リファレンスを確認したほうが良いでしょう。
m.ts10806

2019/08/01 06:42

> <tb>タグでボタンが横に並んでいるのではないのですか? そのようなタグはHTMLに存在しません。 存在しないタグだから何も起きずにただ並べられたとおりに出ているだけです(ボタンタグ自体はインライン要素なので) 回答しました。 JavaScriptの動作よりHTMLの正規化が先です。 できれば、自己解決は取り消してください(あまり参考になりません)
m.ts10806

2019/08/01 06:43

たぶん一通り作りなおしたほうが良さそうです(前の回答でも「参考にする記事が古い」と指摘をうけていたと思います)
guest

回答2

0

ベストアンサー

前提

HTMLをきれいにするところから始めましょう。
JavaScriptの多くはHTMLからのアクションを受け取り、HTMLに返します。
HTMLが正しくないと正しく情報の受け渡しができません。

tableタグがないのにthがあります

html

1<th colspan="3" align="right"><div id="out">0</div></th> 2<th><div id="type"></div></th>

<tb>というタグは存在しません

html

1<table boder="2"> 2 3<tb><input type="button" value="" onClick="den_run(7)"></tb>

あとboderではなくborderですね。
ただ、できればCSSでしましょう。
更にHTML5からは1か空("")しか指定できなくなりました。
2はありません。(ブラウザによっては効くかもしれませんが)

tableタグ内でセルをあらわす<td></td>タグの内部以外にHTMLタグを置いてはいけません

html

1<tb><input type="button" value="" onClick="den_run('+')"></tb> 2<tb><input type="button" value="" onClick="den_run('-')"></tb> 3<br>

scriptタグのlanguageはHTML5で廃止されました

HTML

1<script language="javascript">
<script>で充分です。 今のところ用途がなさそうなformタグも置いておく意味はないかなとは思います。 nameつけているからJavaScriptから後から使う予定なのでしょうか。 下記のようなサイトは活用しましょう。 - [Another HTML-lint](http://www.htmllint.net/html-lint/htmllint.html) 要はHTMLの構文チェックのサイトですね **あと、インデントは揃えましょう。** コードフォーマット機能のあるエディタを利用してください。 そのような機能のついたエディタはたいてい構文チェック機能もついています。 揃えた結果HTML部分のみ(コードフォーマットはEclipseの機能を利用) ```html <h1>電卓</h1> <hr> <form name="name"> <div id="out">0</div> <div id="type"></div> </form> <form name="den"> <table border="1"> <tr> <td><input type="button" value="7" onClick="den_run(7)"></td> <td><input type="button" value="8" onClick="den_run(8)"></td> <td><input type="button" value="9" onClick="den_run(9)"></td> </tr> <tr> <td><input type="button" value="4" onClick="den_run(4)"></td> <td><input type="button" value="5" onClick="den_run(5)"></td> <td><input type="button" value="6" onClick="den_run(6)"></td> </tr> <tr> <td><input type="button" value="1" onClick="den_run(1)"></td> <td><input type="button" value="2" onClick="den_run(2)"></td> <td><input type="button" value="3" onClick="den_run(3)"></td> </tr> <tr> <td><input type="button" value="0" onClick="den_run(0)"></td> <td><input type="button" value="+" onClick="den_run('+')"></td> <td><input type="button" value="-" onClick="den_run('-')"></td> </tr> <tr> <td><input type="button" value="*" onClick="den_run('*')"></td> <td><input type="button" value="/" onClick="den_run('/')"></td> <td><input type="button" value="C" onClick="den_clear('C')"></td> </tr> <tr> <td><input type="button" value="・" onClick="den_period('.')"></td> <td colspan="2"><input type="button" value="=" onClick="den_equal('=')"></td> </tr> </table> </form> ``` # 本題 まずは「なぜ2回押すことになるのか」デバッグしてみましょう。 「コードがどこを通っているか」確認をします。 ```js function den_equal() { console.log(1); ans = eval(ans + kigou + num); //=ボタンを押すとこの計算が動く document.getElementById("out").innerHTML = ans; document.getElementById("type").innerHTML = ""; } ``` 結果はブラウザ開発ツールの「コンソール」で確認できます。 画面キャプチャは貼りませんが1度目で「1」 2度目でもう1回「1」出てます。 den_equal()自体は反応していることが分かります。 では次は「それぞれの値はちゃんときているのか」 確認します。 ```js function den_equal() { console.log(ans); console.log(kigou); console.log(num); ans = eval(ans + kigou + num); //=ボタンを押すとこの計算が動く document.getElementById("out").innerHTML = ans; document.getElementById("type").innerHTML = ""; } ``` ここでおかしいことに気づくと思います。 つまり、「ちゃんと情報が渡ってきていない」ということになります。 このようにして確認していってください。

投稿2019/08/01 06:40

m.ts10806

総合スコア80850

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

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

hakusa.ppl

2019/08/01 06:44

ご丁寧に、ありがとうございます。 参考にさせていただきます。
m.ts10806

2019/08/01 06:50

HTMLがボロボロなのはJavaScriptをやっていくうえでは致命的です。 ドキュメントもしっかりしているのでこれを機会にしっかり覚えましょう。
hakusa.ppl

2019/08/01 06:54

ありがとうございます。 しっかりと一から覚えます
guest

0

html

1<!DOCTYPE HTML> 2<html> 3<head> 4<meta charset="utf-8"> 5<title>電卓</title> 6</head> 7<body> 8<h1>電卓</h1> 9<hr> 10 11<form name="name"> 12<th colspan="3" align="right"><div id="out">0</div></th> 13<th><div id="type"></div></th> 14 15</form> 16 17<form name="den"> 18<table boder="2"> 19 20<tb><input type="button" value="" onClick="den_run(7)"></tb> 21<tb><input type="button" value="" onClick="den_run(8)"></tb> 22<tb><input type="button" value="" onClick="den_run(9)"></tb> 23<br> 24<tb><input type="button" value="" onClick="den_run(4)"></tb> 25<tb><input type="button" value="" onClick="den_run(5)"></tb> 26<tb><input type="button" value="" onClick="den_run(6)"></tb> 27<br> 28<tb><input type="button" value="" onClick="den_run(1)"></tb> 29<tb><input type="button" value="" onClick="den_run(2)"></tb> 30<tb><input type="button" value="" onClick="den_run(3)"></tb> 31<br> 32<tb><input type="button" value="" onClick="den_run(0)"></tb> 33<tb><input type="button" value="" onClick="den_run('+')"></tb> 34<tb><input type="button" value="" onClick="den_run('-')"></tb> 35<br> 36<tb><input type="button" value="" onClick="den_run('*')"></tb> 37<tb><input type="button" value="" onClick="den_run('/')"></tb> 38<tb><input type="button" value="" onClick="den_clear('C')"></tb> 39<br> 40<tb><input type="button" value="" onClick="den_period('.')"></tb> 41<tb><input type="button" value="" onClick="den_equal('=')"></tb> 42 </table> 43</form> 44 45<script language="javascript"> 46ans = 0; //計算中の数字 47num = "0"; //押された数字キーを順番に表示 48Key = ""; //1つ前に押されたキーの記録 49kigou = ""; //数字かいくつか押された後記号キーの把握 50 51 52function den_run(btn) { //変数btnでキーからの情報を受けとる 53 if(!isNaN(btn)){ //数値か記号かで分岐 54 55 if(!isNaN(Key)) { //前に押されたキーは 56 if (num == "0") { //numが0の時 57 num = ""+btn; //キーからの情報 58 } else { 59 60    num += ""+btn; //真 連続して数字が押された場合 61 } 62 } else { 63 num = ""+btn; //偽 記号の後数字、数値を文字列 64 } 65 document.getElementById("out").innerHTML = num;  //outの中身をnumへ 66 }else{ 67 if(!isNaN(Key)) { 68 ans = eval(ans + kigou + num); //追加しました!!!!!! 69 num = "0"; 70 document.getElementById("out").innerHTML = ans; 71 72 } 73 kigou = btn; //記号を受け取ったらbtnから記号へ 74 document.getElementById("type").innerHTML = kigou; //記号が記録そのまま画面 75 } 76 Key = btn; //直前のキーは何か 77} 78function den_period() { 79 if (num.indexOf(".")<0) num +="."; //0より小さいときnumに.をプラスする。 80 document.getElementById("out").innerHTML = num; //outの内容書き換え 81} 82 83function den_clear() { 84 ans = 0; //計算中の数字消去 85 Key = ""; //1つ前の押されたキー削除 86 num = "0"; //押されたキー削除 87 kigou = ""; //記号キー削除 88 document.getElementById("out").innerHTML = num; 89 document.getElementById("type").innerHTML = kigou; 90} 91 92function den_equal() { 93 ans = eval(ans + kigou + num); //=ボタンを押すとこの計算が動く 94 document.getElementById("out").innerHTML = ans; 95 document.getElementById("type").innerHTML = ""; 96} 97 98 99</script> 100 101 102</body> 103</html>

追加しました!!!!!部分追加で解決しました。

投稿2019/08/01 06:34

hakusa.ppl

総合スコア21

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問