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

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

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

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

HTML

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

Q&A

解決済

1回答

8515閲覧

onchangeで呼び出すメソッドにthis.valueを入れたら、出力される結果がおかしいんです。

otftrough

総合スコア476

JavaScript

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

HTML

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

0グッド

0クリップ

投稿2016/01/08 03:44

編集2016/01/08 05:45

<input type="text" onchange="disp(this.value)"> function disp(str){}
と書くと、一度目は正しく表示されますが、2度目以降で前の文字列と混ざったような結果になります。
一度試してみてください。test.html
これを、
<input type="text" onchange="disp(this)"> disp(obj){str = obj.value;}
に変更してみたら正しく表示されました。

ほぼ同じ処理をしていると思いますが、なにが違うんでしょうか?

追記
解決しました。
普段javaを使っているので、文字列の長さをlength()で出そうとしてエラーしたことと、setIntervalの止め方が間違っていたことが原因でした。

`setInterval(function(){` ⇒ `t = setInterval(function(){`

if(i == str.length()) clearInterval();if(i == str.length) clearInterval(t);

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

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

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

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

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

guest

回答1

0

ベストアンサー

リンク先を見ると、str.length()で落ちて clearInterval が実行されないので、常にループし続けています。
changeイベントが発火するたびにループが増えて、並列処理のように前の処理と重なっています。
なぜintervalでループしているのですか? アニメーション風にしたいのですか?

投稿2016/01/08 04:33

tozjp

総合スコア790

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

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

otftrough

2016/01/08 05:05

回答ありがとうございます。 はい、アニメーション風にしたいと思いました。ただの暇つぶしですが。 "str.length()で落ちて clearInterval が実行されない"とはどういう意味でしょうか?
otftrough

2016/01/08 05:36

解決しました。ありがとうございます。
tozjp

2016/01/08 05:45

str.length は関数ではないので実行しようとするとエラーで処理が終了していまいます。 エラーで終了すると、次のループをキャンセルするための clearInterval が実行されないし、次のループのための setInterval はすでに実行されているので、また0.05秒後には次の処理が始まります。 それと落ちる落ちないとは別にですが。 非同期な処理がイベントによって開始される場合、非同期処理が最後まで完了する前にもう一度イベントが発生して、処理が2重に走ってしまった場合にどうなるかを常に考える必要があります。 今回の場合、最初のイベントによる(例えば)10文字目の処理をしようとしている時に、2個めのイベントによる1文字目の処理が始まってしまった場合。 (イベントの順番 . 文字の位置 と表現すると) … 1.8 1.9 1.10 2.1 1.11 2.2 1.12 2.3 … のような順番で処理されてしまいます。 以上の観点で修正をしてみてください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問