チャットのコメント表示順を時系列順にしたい
Firebaseを使用してWebのリアルタイムチャットを作成しています。
Firebaseが展開しているサンプルコード(Friendly Chat)をベースにしています。
二人以上でコメントを投稿すると、自分の投稿したコメントが一番最新(もっとも下)に表示されてしまいます。
ブラウザをリロードすると時系列順のコメント表示となりますが、リロードなしでも時系列順の表示にしたいです。
発生している問題・エラーメッセージ
自身の投稿コメントが最新のものとして表示されてしまい、
他の人が最新のコメントをしても、自身のコメントより古い時系列順で表示されてしまう。
赤:自身のコメント
紫:他人のコメント(後からコメントしたにも関わらず、表示順が後ろになる)
該当のソースコード
JavaScript
1// Displays a Message in the UI. 2function displayMessage(id, timestamp, name, text, picUrl, imageUrl) { 3 var div = document.getElementById(id); 4 // If an element for that message does not exists yet we create it. 5 if (!div) { 6 var container = document.createElement('div'); 7 container.innerHTML = MESSAGE_TEMPLATE; 8 div = container.firstChild; 9 div.setAttribute('id', id); 10 div.setAttribute('timestamp', timestamp); 11 for (var i = 0; i < messageListElement.children.length; i++) { 12 var child = messageListElement.children[i]; 13 var time = child.getAttribute('timestamp'); 14 if (time && time > timestamp) { 15 break; 16 } 17 } 18 messageListElement.insertBefore(div, child); 19 } 20 if (picUrl) { 21 div.querySelector('.pic').style.backgroundImage = 'url(' + addSizeToGoogleProfilePic(picUrl) + ')'; 22 } 23 div.querySelector('.name').textContent = name; 24 var messageElement = div.querySelector('.message'); 25 if (text) { // If the message is text. 26 messageElement.textContent = text; 27 // Replace all line breaks by <br>. 28 messageElement.innerHTML = messageElement.innerHTML.replace(/\n/g, '<br>'); 29 } else if (imageUrl) { // If the message is an image. 30 var image = document.createElement('img'); 31 image.addEventListener('load', function() { 32 messageListElement.scrollTop = messageListElement.scrollHeight; 33 }); 34 image.src = imageUrl + '&' + new Date().getTime(); 35 messageElement.innerHTML = ''; 36 messageElement.appendChild(image); 37 } 38 // Show the card fading-in and scroll to view the new message. 39 setTimeout(function() {div.classList.add('visible')}, 1); 40 messageListElement.scrollTop = messageListElement.scrollHeight; 41 messageInputElement.focus(); 42} 43 44// Loads chat messages history and listens for upcoming ones. 45function loadMessages() { 46 // TODO 8: Load and listens for new messages. 47 var query = firebase.firestore() 48 .collection('messages') 49 .orderBy('timestamp', 'asc'); 50// .limit(12); 51 // Start listening to the query 52 query.onSnapshot(function(snapshot) { 53 snapshot.docChanges().forEach(function(change) { 54 if (change.type === 'removed') { 55 deleteMessage(change.doc.id); 56 } else { 57 var message = change.doc.data(); 58 displayMessage(change.doc.id, message.timestamp, message.name, 59 message.text, message.profilePicUrl, message.imageUrl); 60 } 61 }); 62 }); 63} 64
試したこと
Firebase上のデータベース及び、上記コードのorderByをascに変更
補足情報(FW/ツールのバージョンなど)
Firebase
Javascript
回答1件
あなたの回答
tips
プレビュー