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

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

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

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

Q&A

3回答

2484閲覧

JavaScriptの変数の更新

退会済みユーザー

退会済みユーザー

総合スコア0

JavaScript

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

0グッド

0クリップ

投稿2015/08/27 00:35

下記のコードはプロンプトで入力された数字をinnerHTMLに表示し保存するというコードです。
そこまではうまくいくのですがこれを
次回入力された数字が前回より大きな数字だった場合のみ保存
という風にするにはどうすればいいのでしょうか?

JavaScript

1<body> 2 <input type="button" value="start" onclick="start()"> 3 <div id="result"></div> 4<script> 5function start() { 6 var num = prompt("数字を入力"); 7 document.getElementById('result').innerHTML = num; 8 save(); 9} 10window.onload = function(){ 11 var body_num = localStorage.getItem('num'); 12 document.getElementById('result').innerHTML = body_num; 13} 14 15function save(){ 16 localStorage.setItem('num', document.getElementById('result').innerHTML); 17} 18 19 20</script> 21</body>

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

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

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

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

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

guest

回答3

0

既に質問者さんは見ておられない様子ですが、他の回答者さんにコメントした手前何も回答しないのは失礼かと思うので回答を残します。
JSFiddle に下記HTMLをUPしました。

HTML

1<script> 2'use strict'; 3function getNumber () { 4 var number = localStorage.getItem('num'); 5 return number ? Number(number) : NaN; 6} 7 8function handleStart () { 9 var numberString = prompt('数字を入力'), 10 number = Number(numberString), 11 oldNumber = getNumber(); 12 13 if (numberString === number.toString() && !isNaN(number) && (number > oldNumber || isNaN(oldNumber))) { 14 localStorage.setItem('num', numberString); 15 document.getElementById('result').firstChild.data = number; 16 } 17} 18 19function handleInitialize () { 20 localStorage.removeItem('num'); 21 document.getElementById('result').firstChild.data = '出力値'; 22} 23 24function handleDOMContentLoaded () { 25 var number = getNumber(); 26 27 if (!isNaN(number)) { 28 document.getElementById('result').firstChild.data = number; 29 } 30} 31 32document.addEventListener('DOMContentLoaded', handleDOMContentLoaded, false); 33</script> 34</head> 35<body> 36 37<input type="button" value="start" onclick="handleStart()"> 38<input type="button" value="initialize" onclick="handleInitialize()"> 39<div id="result">出力値</div>
  • localStrage は String 型でデータが保存される為、数値の大小比較するためには Number 型へ変換する必要があります
  • Number 型への変換方法は主に Number(), parseInt(), parseFloat() の三種類が存在しますが、ここでは最も簡易的処理となる Number() を採用しました
  • Number() (内部的には ToNumber) で Number 型へ型変換した後に Number.prototype.toString で String 型に戻し、元々の文字列と照合する事で正規の数値文字列かを確認しています
  • localStrage にゴミが残ると良くないので削除処理も入れておきました
  • locasStrageIE8+で使えるメソッドです(IE7 に対応するなら Cookie を使用して下さい)
  • addEventListenerIE9+ で使えるメソッドです(諸般の事情で addEventListener を使用しましたが、IE8 に対応するなら attachEvent or body[onload] を使用して下さい)

投稿2015/09/01 03:43

think49

総合スコア18164

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

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

退会済みユーザー

退会済みユーザー

2015/09/01 23:40

もう一度回答していただいたものを読んで書いてみます! ありがとうございます
guest

0

ShunsukeIzuiさまの書かれている通り、前の値と入力された値を比較するif文をつければOKだとおもいます。

個人的には値を取得する関数に切り分けてると見通しが良くなるかなと思いました。
後は、マイナスの数と0の時の処理の取りこぼしに気をつければ良さそうな気がします。

javascript

1/* 値を取得するだけ */ 2function getNum() { 3 return localStorage.getItem('num'); 4} 5/* 渡された値を保存するだけ */ 6function save(num){ 7 /* 必要であれば ここに num が数値ではなければ弾くバリデーションを入れる。*/ 8 localStorage.setItem('num', num); 9} 10 11function start() { 12 var num = getNum(); 13 // 空文字列をNaNにするためにparseInt()を使用。Number()だと0になってしまう。 14 var newNum = parseInt(prompt("数字を入力"), 10); 15 /* 16 * 0 の時も比較できるようにnewNumの有無を (newNum || newNum === 0) で判定 17 * num-0 して数値化して比較する。 18 * なにも保存されてない時マイナスの数を入力されると 19 * newNum > num-0 だけだと 0 との比較になって保存されないので、 20 * newNumがあってnumがnullの場合は保存するようにする 21 */ 22 if((newNum || newNum === 0) && (newNum > num-0 || !num)) { 23 document.getElementById('result').innerHTML = newNum; 24 save(newNum); 25 } 26} 27 28window.onload = function(){ 29 var body_num = getNum(); 30 document.getElementById('result').innerHTML = body_num; 31};

parseInt()Number()も入力される値によって変換のクセがあるので完璧に数値の入力しか受け付けないとかにするのであれば、入力値を直ぐに変換するのではなく間にバリデーションを入れてその後で変換するなどとした方が良いと思います。

型変換のいろいろ

投稿2015/08/27 03:08

KiKiKi_KiKi

総合スコア596

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

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

think49

2015/08/30 02:24

> // 空文字列をNaNにするためにparseInt()を使用。Number()だと0になってしまう。 私見ですが、parseInt() は parseInt('1foo') === 1; や parseInt('3.14') === 3 が成立する仕様がもやもやします。 Number('') === 0 を敬遠するのであれば、下記対策が考えられます。 - /^-?\d+(?:\.\d+)?$/.test(numberString) で判定してから Number() - prompt() を止めて input[pattern] で validation してから Number() - numberString === Number(numberString).toString() で判定(numberString === 'NaN' の例外処理が必要)
KiKiKi_KiKi

2015/08/31 08:54

think49さん はい、parseInt()の単位の様なものがある場合の挙動も存じております。 Number()、parseInt()いずれにせよ、癖があるので、 > parseInt()もNumber()も入力される値によって変換のクセがあるので完璧に数値の入力しか受け付けないとかにするのであれば、入力値を直ぐに変換するのではなく間にバリデーションを入れてその後で変換するなどとした方が良いと思います。 と書いていましたが、parseInt()の方は説明不足でしたので補足説明ありがとうございます。
think49

2015/09/01 03:51 編集

いずれも癖があるのは分かるのですが、どちらかといえば parseInt() の方が独自処理が多いのではないかなという気がしたもので、Number() の独自処理だけ説明されているのがやや不公平に感じてしまいました…。 http://www.ecma-international.org/ecma-262/6.0/#sec-number-constructor http://www.ecma-international.org/ecma-262/6.0/#sec-parseint-string-radix http://www.ecma-international.org/ecma-262/6.0/#sec-parsefloat-string Number() が内部的に使用している ToNumber は ES のネイティブメソッドで Number 型に型変換する時にも使われるという事もあり、Number(" ") === 0 はデフォルト値として許容できる考えを持っていますが、ToNumber で独自値を入れる処理がそれぐらいだと思うので、if (/^\s+$/.test(numberString)) { return NaN } を入れるだけで済むかもしれません。 http://www.ecma-international.org/ecma-262/6.0/#sec-tonumber-applied-to-the-string-type でも、validate 処理をいろいろ考えるのは面倒なので Number.prototype.toString で照合すれば、ES に処理を丸投げ出来て実装的に楽だなーと思います。 https://teratail.com/questions/15206#r23914
guest

0

javascript

1function start() { 2 var num = prompt("数字を入力"); 3 var nowValue = parseInt(document.getElementById("result").innerHTML, 10); 4 if(!isNaN(nowValue) && nowValue < parseInt(num, 10)){ 5 document.getElementById('result').innerHTML = num; 6 save(); 7 } 8} 9

上記のようにしてみてはいかがでしょうか?

現在表示されている値と入力された値を数値にして比較しているだけです。

投稿2015/08/27 00:53

orange0190

総合スコア1698

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

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

退会済みユーザー

退会済みユーザー

2015/08/27 01:22

回答ありがとうございます いくつか解説お願いしたいです・・・。 var nowValue = parseInt(document.getElementById("result").innerHTML, 10); の10とはなんなのでしょうか? if(!isNaN(nowValue) && nowValue < parseInt(num, 10)) の!isNaN(nowValue)とは?NaNじゃなかったらということでしょうか?
orange0190

2015/08/27 01:48

>var nowValue = parseInt(document.getElementById("result").innerHTML, 10); >の10とはなんなのでしょうか? こちらは十進数の数値に変換するという意味です。「10」で十進数を指定しています。 >if(!isNaN(nowValue) && nowValue < parseInt(num, 10)) >の!isNaN(nowValue)とは?NaNじゃなかったらということでしょうか? そのとおりです。parseIntは数値を含まないような文字列(例えば、「abc」といった文字列)を変換するとNaN(Not a Number)を返しますので、そのような場合を拒否しています。 これを書いて思ったのですが、最初に示したコードはまずいですね。次のようにしてください。 function start() { var num = prompt("数字を入力"); num = parseInt(num, 10); var nowValue = parseInt(document.getElementById("result").innerHTML, 10); if(!isNaN(nowValue) && !isNaN(nowValue) && nowValue < num){ document.getElementById('result').innerHTML = num; save(); } }
KiKiKi_KiKi

2015/08/27 03:20

コメント中のif文の中に !isNaN(nowValue) && !isNaN(nowValue) && 〜と二回繰り返されていますが、 !isNaN(num) && !isNaN(nowValue) && 〜 の書き間違いでしょうか? また、初回の何も保存されていない時、nowValueは`parseInt('', 10);`になるので常にNaNになってしまうように思います。で、NaN > num で数値比較しても常にfalseになってしまったように思いますので、上手く動作しないような気がしますが、いかがでしょうか?
think49

2015/08/30 02:28

To: ShunsukeIzuiさん 補足しますと、isNaN() は NaN 値の判定ではなく、Number 型へ変換した時に NaN になれば true を返します。 つまり、isNaN('string') === true です。 parseInt() で Number 型へ変換済の為、この場合は NaN の判定として機能しますが、isNaN() の機能として記憶してしまうと混乱の元なので補足しました。 NaN の判定には Number.isNaN() を使います。
orange0190

2015/08/31 00:31

KiKiKi_KiKiさん >コメント中のif文の中に !isNaN(nowValue) && !isNaN(nowValue) && 〜と二回繰り返されていますが、 !isNaN(num) && !isNaN(nowValue) && 〜 の書き間違いでしょうか? その通り、書き間違いです。 >また、初回の何も保存されていない時、nowValueは`parseInt('', 10);`になるので常にNaNになってしまうように思います。で、NaN > num で数値比較しても常にfalseになってしまったように思いますので、上手く動作しないような気がしますが、いかがでしょうか? 確かに最初がうまく動作しないですね。ご指摘ありがとうございます。 think49さん 補足説明ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問