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

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

新規登録して質問してみよう
ただいま回答率
85.48%
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回答

2107閲覧

Ajaxのデータの取得について

nanase21

総合スコア144

JavaScript

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

jQuery

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

Ajax

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

1グッド

0クリップ

投稿2019/08/26 14:53

#実現したいこと
一定のタイミングでAjaxを使い、サーバーにアクセスしてview側に表示しているデータの差分を比較し、不足分だけを取得し、表示するようにしている。

#困っていること
var data_count = $('.chat_count').length;
上記のコードで要素数をカウントしているが、Ajaxで挿入した要素数がカウントされなくて困っている。
どのようにしたら、ajaxで出力した要素数がカウントされるかご教示いただけると幸いです。

js

1$(function() { 2 var POLLLING_INVERVAL_TIME_IN_MILLIS = 10000;//10s 3 (function polling() { 4 if(!document.hidden) { 5 getCountUp(); 6 } 7 window.setTimeout(polling, POLLLING_INVERVAL_TIME_IN_MILLIS); 8 }()); 9 10 11 function getCountUp() { 12 var room_id = document.getElementById("room_id").value; 13 //ここで、要素の数を取得している。要素の数とサーバーのレコード数を比較して不足分だけ取得するようにしている。 14 var data_count = $('.chat_count').length; 15 console.log(data_count); 16 if(data_count > 0){ 17 $.ajax({ 18 url: `/rooms/${room_id}/get_data_ajax/?count=${data_count}`, 19 type: "GET", 20 data: {memos: 'text'}, 21 dataType: "json", 22 success: function (data) { 23 for(var i=0;i<data.length;i++){ 24 console.log(data[i].text); 25 $('#chat_areat').append('<div class="row data_count"><div class="col py-2 border-bottom"><div class="user-name">' + `${data[i].text}` + '</div><div class="content">' + `${data[i].text}` + '</div></div></div>'); 26 } 27 }, 28 error: function (data) { 29 console.log("error"); 30 } 31 }); 32 } 33 } 34});
jun68ykt👍を押しています

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

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

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

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

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

yambejp

2019/08/27 00:52

DOMの処理が通常のjsとjQueryを雑多につかっていてわかりにくくないですか? どちらかに寄せたほうが管理しやすいと思います
nanase21

2019/08/27 04:18

ご指摘いただきありがとうございます。 仰る通り、jsかjqueryのどちらかに統一すべきなんですが、jsですべて書くのが難しく分からなくなるとついついjqueryを使ってしまうので可読性の悪いコードだと私自身も思います。
yambejp

2019/08/27 04:21

ブラウザを限定できるなら$.ajaxではなくfetchでの処理が楽です とくにfetchはpromiseを返してくれるので非同期処理を最適化できます
nanase21

2019/08/27 04:29

ご教示いただきありがとうございます。 fetchについて調べさせていただきました。 jsにすべて書き直す際に、fetchを使用してみたいと思います。 それとお聞きしたいことがあるのですが、リアルタイムのオープンチャットをwebsoketを使用せずに実装しようとしているのですが、非同期通信(ロングポーリング)で実装するのはどのように思いますでしょうか?
guest

回答2

0

ベストアンサー

こんにちは

ぱっと見で、「ここが怪しいのでは?」と思った点を回答します。

ご質問に

var data_count = $('.chat_count').length;
上記のコードで要素数をカウントしているが、

とあり、上記ではクラスにchat_count を持つ要素の数を数えていますが、ajax で取得してきた内容を append する行は、以下

javascript

1$('#chat_areat').append('<div class="row data_count"><div class="col py-2 border-bottom"><div class="user-name">' + `${data[i].text}` + '</div><div class="content">' + `${data[i].text}` + '</div></div></div>');

となっており、 append される対象の一番外側の <div> のクラスは row data_count となっているほか、その中の子孫の要素のどれにも、var data_count = $('.chat_count').length;で数え上げの対象となっているchat_countというクラスを持つ要素は出てきていません。

もしこれが単純なミスでしたら、以下のように修正すれば意図通りになるかもしれません。

修正前

javascript

1var data_count = $('.chat_count').length;

修正後

javascript

1var data_count = $('.data_count').length;

以上参考になれば幸いです。

投稿2019/08/26 15:34

編集2019/08/26 15:55
jun68ykt

総合スコア9058

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

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

nanase21

2019/08/27 04:11

ご教示いただきありがとうございます。 ご指摘いただいた通り,ajaxで出力するクラス名がchat_countからdata_countになっていたため意図した処理になっていませんでした。
jun68ykt

2019/08/27 04:53

どういたしまして。解決したようで、よかったです????
guest

0

javascript

1 2 var room_id = document.getElementById("room_id").value; 3 //ここで、要素の数を取得している。要素の数とサーバーのレコード数を比較して不足分だけ取得するようにしている。 4 var data_count = $('.chat_count').length; 5 console.log(data_count); 6 if(data_count > 0){ 7 $.ajax({ 8 url: `/rooms/${room_id}/get_data_ajax/?count=${data_count}`,

この辺りのコードを見る限りで推測するに、

`/rooms/${room_id}/get_data_ajax/?count=${data_count}`

こことか、"' で囲まなくてはならないところを ` になっているし、

変数 room_id なのに ${room_id} とか、JavaScript と PHP を混同しているのかとも思える。

いずれにしても、デベロッパーツールを見ればエラーメッセージが表示されているだろうと思います。

投稿2019/08/26 15:03

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

退会済みユーザー

退会済みユーザー

2019/08/26 15:25

あらま、ありがとうございます! 素直に知らんかった・・・
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問