前提・実現したいこと
javascript(html.css)でチャットアプリを作っています。
メッセージの送信日時表示する機能を実装中なのですが、更新ボタンを押すと全てのメッセージの送信日時が更新されてしまいます。
(画像では青い枠と書いてありますが画像編集の過程でグレーになってしまいました。)
発生している問題・エラーメッセージ
Web上の更新ボタンを押すと全てのメッセージの日時が更新されてしまう。
該当のソースコード
javascript
//受信
ref.on("child_added",function(data){
const v = data.val();
const k = data.key;
var date = new Date(); date.setTime(v.timestamp); var month = date.getMonth() + 1; var day = date.getDate(); var hours = date.getHours(); var minutes = date.getMinutes(); var time = (time = month + "/" + day + " " + hours + ":" + minutes); const h = '<p>'+"名前: "+v.uname+'<br>'+v.text+'<br>'+"投稿時刻:"+time+'</p>'; $("#output").prepend(h);
});
</script>試したこと
日時を設定するidを作成したりしましたが、エラーになり混乱しています。
プログラミング初心者の為、説明不足な点も多いですが何卒よろしくお願い致します。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答2件
0
ベストアンサー
「フィールドの作成はコードのみで行いました。」とのことですが、
どんなコードですか?
それと同じ感じで、
timestampという名前の、整数型のフィールド
を作成できませんか?
[追記]
回答にコメントしようとして、間違って、新しい回答を作ってしまいました。
大変、失礼しました。
投稿2020/11/30 03:18
編集2020/11/30 03:31総合スコア1323
0
メッセージが送信された日時を表示したいんですよね?
でも、いまのコードだと、child_added
イベントが発生したときの日時が表示されてしまいますね。child_added
イベントが、メッセージ送信時のみに発生するなら、これでも良いですが、それ以外のタイミングでも発生するとしたら、困りますね。
あてずっぽうですが、メッセージが送信された日時は、v
に入ってるんじゃないですか? v.timestamp
とか? v
には、たぶん、データベースから読んだレコードの内容が入ってるんじゃないでしょうか。
もしそうなら、それを使ってh
を組み立てれば良いと思います。
追記
このチャットアプリの流れを、想像も踏まえて書いてみます。
※なお、ここでは「フィールド」をFirebase上でのデータの項目名のような意味で使っています。画面の入力欄という意味ではないです。
投稿処理
(1)
ブラウザ画面に、名前とメッセージの入力欄が表示される。
(2)
ユーザが、名前とメッセージを入力して、「投稿する」ボタンを押す。
(3)
Javascriptで、入力欄の内容を読み取り、それをサーバ(Firebase)へ送信する。
このとき、名前はuname
フィールド、メッセージはtext
フィールドとして
Firebaseへ送信している。
投稿一覧表示処理
(4)
新しい投稿が登録されたり、画面を再描画したとき、
Firebaseからchild_added
イベントが届く。
1つの投稿につき、1つのイベントが届く。
(5)
イベントデータdata
から、Firebaseに登録された投稿データの、
各フィールド(uname
やtext
)の値を取り出すことができるので、
それをHTMLタグに加工して画面に出力する。
改良点1
(3)のところで、uname
とtext
に加えて、
「投稿日時」を表すフィールドtimestamp
も
Firebaseへ送信するようにしましょう。
この「投稿日時」は、ユーザに入力してもらう情報ではありません。
Javascriptでnew Date()
すれば、得られます。
ただし、JavascriptのDate
オブジェクトをFirebaseに登録することは、できないかもしれませんので、数値に変換して送信しましょう。
javascript
1var now = new Date().getTime(); // 現在日時を数値に変換 2 3// Firebaseへ送信 4ref.push({ 5 uname: ... 6 text: ... 7 timestamp: now // ←ここ 8}, .....
改良点2
(5)のところでは、uname
とtext
に加えて、
timestamp
フィールドの値も取り出し、画面に出力しましょう。
これは、おそらく、
質問文の「//受信する際のコード」に書いてあるコードに、1行追加するだけでOKです。
javascript
1ref.on("child_added",function(data){ 2const v = data.val(); 3const k = data.key; 4 5var date = new Date(); 6date.setTime(v.timestamp); // ←ここ 7var month = date.getMonth() + 1; 8var day = date.getDate(); 9var hours = date.getHours(); 10var minutes = date.getMinutes(); 11var time = (time = month + "/" + day + " " + hours + ":" + minutes); 12 13const h = '<p>'+v.uname+'<br>'+v.text+'<br>'+time+'</p>';
追記2
改良点3
このアプリを作るときに、Firebaseにログインして、データベースの新規作成などを実行したと思います。そのとき、データベースのフィールドとして、
uname
という名前の、テキスト文字列型のフィールドtext
という名前の、テキスト文字列型のフィールド
を登録した記憶はありませんか?
もしあるなら、そこに
timestamp
という名前の、整数型のフィールド
を追加してみてください。
※私自身はFirebaseを使ったことがないので、ゴールまで少々遠回りしてると思いますが、ご容赦ください。
投稿2020/11/27 16:08
編集2020/11/29 23:43総合スコア1323
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/11/27 16:33
2020/11/27 17:04
2020/11/28 02:08
2020/11/28 10:03
2020/11/28 12:41
2020/11/28 13:00
2020/11/28 13:41
2020/11/28 14:12
2020/11/28 14:35
2020/11/29 08:27
2020/11/29 14:39
2020/11/29 17:00
2020/11/29 23:45
2020/11/30 00:01
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/11/30 03:27
2020/11/30 03:41
2020/11/30 03:46
2020/11/30 05:03