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

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

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

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

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

Ajax

Ajaxとは、Webブラウザ内で搭載されているJavaScriptのHTTP通信機能を使って非同期通信を利用し、インターフェイスの構築などを行う技術の総称です。XMLドキュメントを指定したURLから読み込み、画面描画やユーザの操作などと並行してサーバと非同期に通信するWebアプリケーションを実現することができます。

HTML

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

Q&A

解決済

1回答

561閲覧

JavaScriptで意図しない返り値を取得してしまう(Ajax)

bonokame

総合スコア5

JavaScript

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

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

Ajax

Ajaxとは、Webブラウザ内で搭載されているJavaScriptのHTTP通信機能を使って非同期通信を利用し、インターフェイスの構築などを行う技術の総称です。XMLドキュメントを指定したURLから読み込み、画面描画やユーザの操作などと並行してサーバと非同期に通信するWebアプリケーションを実現することができます。

HTML

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

0グッド

0クリップ

投稿2020/09/09 10:31

フォームの値のチェックをJavaScriptにて行っているのですが、Ajax通信の結果を待つことなく値を返してしまいます。

javascript

1function check(){ 2 //idが使用されているか 3 isUsedAPI(username).done(function(result) { 4 message = result["Message"] 5 if (message != "NOTUSED") { 6 if (message == "ERROR") { 7 $(".message").html(result["Err"]); 8 return false 9 } 10 $(".message").html("そのIDはすでに使用されています"); 11 return false 12 } 13 return true 14 }).fail(function() { 15 $(".message").html("通信エラー"); 16 return false 17 }) 18} 19function isUsedAPI(id) 20{ 21 return $.ajax({ 22 url: "http://localhost:8080/isUsed", 23 type: "POST", 24 dataType: 'json', 25 data: { 26 userid: id 27 }, 28 timespan: 1000 29 }) 30}

html

1 <form action="create.php" method="POST"> 2 ユーザー名 3 <input id="user" type="text" name="userid" class="input"> 4 ニックネーム(公開される名前) 5 <input id="nick" type="text" name="nickname" class="input"> 6 パスワード 7 <input id="pass" type="password" name="password" class="input"> 8 パスワード(確認) 9 <input id="repass" type="password" class="input"> 10 <button type="submit" class="loginbutton" onclick="return check()">登録</button> 11 </form>

これを実行するとisUsedAPI()の結果に関わらずリクエストが行われてしまいます
ご教授お願いします

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

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

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

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

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

m.ts10806

2020/09/09 10:59

これは何を参考に作られましたか? 通常は、ajaxの流れの中でdoneするものかと思いますが。
hentaiman

2020/09/09 13:32

jqueryのajaxの動作を勘違いしてるだけな気がする 一度公式でもそこら辺のてきとーなサイトでも良いから動作を再確認するのがいいでしょうね
bonokame

2020/09/09 13:56

他の箇所はこの方式で全て動いてるんですよね.. isUsedAPI().done(){} の処理を待たずにcheck()が値を返しているのではないかと思います。 check()にisUsedAPI().done(){}の処理を待ってもらうことはできないのでしょうか?
hentaiman

2020/09/09 14:02

とりあえず、非同期処理のajaxの書き方調べれば期待した処理を作れると思いますよ。参考サイトにも書いてありますが。 ですが勘違いや間違った理解は正した方が「たまたまうまく動いた」というのを避けられるので前述の通り動作の再確認をお勧めします。
bonokame

2020/09/09 14:17

問題は解決したのですが、まだajaxの非同期処理については十分理解していなかったのでこれを機に復習してみようと思います。丁寧なご回答ありがとうございました。
guest

回答1

0

ベストアンサー

非同期通信の Promise 中で return をしても check() の返り値にはならず、
Formの送信はキャンセルできないので、やりたいことはおそらくこんな感じなのかと思います

javascript

1function check(event){ 2 event.preventDefault(); // Form の送信をキャンセル 3 4 isUsedAPI(username).done(function(result) { 5 message = result["Message"] 6 if (message != "NOTUSED") { 7 if (message == "ERROR") { 8 $(".message").html(result["Err"]); 9 return // 何もしない 10 } 11 $(".message").html("そのIDはすでに使用されています"); 12 return // 何もしない 13 } 14 $('#form').submit(); // Form の submit 実行。<form id="form"> のように id なり何なりでアクセスできるようにする必要があります。 15 }).fail(function() { 16 $(".message").html("通信エラー"); 17 return // 何もしない 18 }) 19}

投稿2020/09/09 14:05

編集2020/09/09 14:16
unhappychoice

総合スコア1531

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

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

bonokame

2020/09/09 14:18

ありがとうございます! この手法で意図した処理ができるようになりました...!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問