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

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

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

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

JavaScript

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

jQuery

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

Ajax

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

Q&A

解決済

2回答

4176閲覧

ajaxで、整形式になっていません。不明 と出て困ってます。

tsuru0508

総合スコア65

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

JavaScript

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

jQuery

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

Ajax

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

0グッド

0クリップ

投稿2016/11/29 15:48

編集2016/11/30 01:26

###前提・実現したいこと
いつも大変お世話になっております。

整形式になっていません を出ないようにしたい。
XMLパースというのでしょうか?間違いを見つける事ができません。

どなたかヒントをいただけませんでしょうか?
何卒、よろしくお願いします。

*同期については、データ登録の際の登録前チェックのため、
非同期だと困るので、とりあえずは・・・
非同期でも同期のようにタイミングを取る方法があるようですが、
難しいので、後々にしようと思ってます。

###発生している問題・エラーメッセージ
firefoxのデバッガには、

整形式になっていません。 (不明) ユーザ体験に対して好ましくない影響があるため、メインスレッドでの同期 XMLHttpRequest は推奨されません。詳しくは http://xhr.spec.whatwg.org/ を参照してください。

###該当のソースコード

呼び出し元のjavascript //2:ログインIDとして問題なければ、念のため、重複していないか、チェック。ajaxは、同期通信「async: false」 var val = $("#id_loginid").val(); //入力した値を取得 $.ajax({ type: "POST", url: "accchk.php", data: "account="+val, async: false, success: function(xml){ $(xml).find("item").each(function(){ var check = $(this).find("check").text(); if( check == 1 ){ alert('そのIDは使用済です。違うIDにしてください。'); $("#id_rtn").val("ng"); return false; } }); } }); if(document.getElementById('id_rtn').value=='ng'){ return false; }
accchk.php <?php header("Content-Type: application/xml"); echo '<?xml version="1.0" encoding="UTF-8" ?>' . "\n"; //受け取った変数が使用済かどうかを確認 //実際はDBなどへ問い合わせる事が多いと思う 省略 if($stmt->rowCount() >= 1){ $check = true; //使用済ならTRUE }else{ $check = false; //使ってなければFALSE } echo '<rss>'."\n"; echo ' <item xml:space="preserve">'."\n"; echo ' <check>'.$check.'</check>'."\n"; echo ' </item>'."\n"; echo '</rss>'."\n"; ?>

###試したこと
課題に対してアプローチしたことを記載してください
" や ' や ? を、書き直したり、" にしてみたり・・・

追記
あと、javascriptは戻り値を1で判定してますが、
送るときは、ture、falseで返してます。
でも、他が原因かもしれませんが、1,0に変えると
うまいこと動かなかったので、ajaxって不思議って、、
私の思考に方が不思議かもしれませんが、、

しっかりチェック出来てないかもしれません。
家に帰ってもう一度試してみます。

追記2
戻り値を1,0にしても、true,falseにしても、
結果は同じでした。

###補足情報(言語/FW/ツール等のバージョンなど)
1回2回なら、動くのですが、何回もエラーだしていると
javascriptが動かなくなります。

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

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

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

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

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

guest

回答2

0

ベストアンサー

はじめまして。

おそらく、実現したいのは、ユーザの登録フォーム等で、
ユーザがIDを入力している時に裏側でajaxを使って登録済みなら「既に使われてます」のようなエラーを出してあげる事だと思います。

FireFoxが「ユーザに好ましくない体験」と言っているのは、
同期的にajaxを使って処理を行うとその間ユーザは何も操作が出来なくなるためです。
仮にkeyupイベントなどにこの処理を紐付けた場合、1文字入力する毎に何も出来なくなるというのはかなり辛く感じます。
(最初は良くても、サーバ側の処理が重くなり、チェックに時間がかかる場合などはそうです)

なので、ここでのチェックはあくまでも非同期で行い、最終的に使えるかどうかのチェックはフォームの送信先で行うと良いと思います。
(ajaxでチェックしてから、フォームがsubmitされるまでに同じIDで登録があったら弾けないですから)

ので、私だったらこうするという処理を書いてみたので良かったら参考にしてみてください。

意識して変えた点

  • 通信はPOSTでなくGET(POSTはサーバ側のデータを更新する時に使う認識だからです
  • サーバ側の返り値はjson(jsと相性が良く扱いやすいので)
  • ajaxは非同期に(ユーザ体験を重視)

html

1<!DOCTYPE html> 2<html lang="ja"> 3<head> 4 <meta charset="UTF-8"> 5 <title>ユーザIDの入力チェック</title> 6 <style> 7 .red { 8 color: red; 9 } 10 11 .green { 12 color: green; 13 } 14 </style> 15</head> 16<body> 17 <input type="text" id="login_id"> 18 <p id="result"></p> 19 20 <script src="https://code.jquery.com/jquery-3.1.1.min.js"></script> 21 <script> 22 23 $(function() { 24 // ユーザIDが入力されたら利用可能かチェック 25 $('#login_id').on('keyup', function() { 26 var loginId = $('#login_id').val(); 27 $('#result').text('').removeClass(); 28 29 $.ajax({ 30 type: "GET", 31 url: "test.php", 32 data: {"loginId": loginId }, 33 success: function(result) { 34 // resultには、利用済みならis_usedがtrueで返ってくる 35 var decodedResult = JSON.parse(result); 36 37 if (decodedResult.is_used) { 38 $('#result').text('そのユーザIDは既に利用済みです').addClass('red'); 39 } else { 40 $('#result').text('そのユーザIDなら利用出来ます').addClass('green'); 41 } 42 } 43 }); 44 }); 45 }); 46 47 </script> 48</body> 49</html>

test.php

1<?php 2 3$loginId = isset($_GET['loginId']) ? $_GET['loginId'] : ''; 4 5$result = false; 6 7if ($loginId === 'test') { 8 $result = true; 9} 10 11 12echo json_encode([ 13 'is_used' => $result 14]);

投稿2016/11/30 15:22

coffee

総合スコア139

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

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

tsuru0508

2016/11/30 23:20

coffeeさん、ありがとうございます。 また、サンプルソースもありがとうございます。 丁度jsonを調べてたところです。 私も最初、ボタン押して重複チェックをしていました。 ただ、登録直前に変えられたら、意味ないなと、、、で、 登録ボタン押した後、チェックをするようにしました。 最初は非同期でしたが、エラーのタイミングが遅れてくるのが、 気持ち悪く同期に変えた次第です。 hiddenでflag たてて、判断すればいいかも知れませんね。 一度チャレンジしてみます。
tsuru0508

2016/12/01 23:19

coffeeさま おはようございます。 本件ありがとうございます!無事エラーを出さずに動きました。 同期、非同期の問題だけですが、いずれ非同期で処理する事にします。 せっかく全部ポストせずに、DBにアクセス出来るので、、、 ご支援感謝いたします。ありがとうございました。
guest

0

data: "account="+val,

data : {"account":val},
の誤りではないですか?

投稿2016/11/30 00:13

akio221

総合スコア716

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

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

tsuru0508

2016/11/30 01:24

ありがとうございます。 シンタックスエラーになりましたので、もともとの表記でよさそうです。
akio221

2016/11/30 01:40 編集

シンタックスですか?どんな記述になりましたか?
tsuru0508

2016/11/30 01:48

ありがとうございます。 SyntaxError: missing : after property id です。  data: {"account="+val},
akio221

2016/11/30 01:54

えーと、その送り方だと間違っていますよ。 「ajax data post」あたりで検索して、再度、そのデータの送り方を書き直してみてください。 data:に対して、連想配列で送るので、{"キー":"値"}形式になるかと・・・。
tsuru0508

2016/11/30 01:58

ありがとうございます。 一度やってみます。
tsuru0508

2016/12/01 23:23

akio221さま おはようございます。
tsuru0508

2016/12/01 23:27

書き方おもいっきり間違えてました。汗 ご支援ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問