コメント欄に無限スクロール機能を実装しています。YouTubeのコメント欄のような感じで、スクロールバーが最下部に達すると、新しくコメントを取得して描画するような処理を行なっています。
JavaScript
1 let scrollLock = false; 2 3 // 取得したコメントを描画する関数 4 const loadCommentsIntoSection = (postedComments) => { 5 let html = ''; 6 postedComments.forEach((comment) => { 7 const { time, content, createdBy } = comment; 8 const displayTime = calculateTimeDiffer(time); 9 html += '<div class="comment-box">' 10 html += `<div id="picture-parent"><img src="${createdBy.picture}" id="user-picture"></div>`; 11 html += `<div id="comment-body"><p>${createdBy.displayName} ${displayTime}</p><p>${content}</p></div>`; 12 html += '</div><hr>'; 13 }); 14 createLoadingElm(); 15 setTimeout(() => { 16 commentContainer.insertAdjacentHTML('beforeend', html); 17 destroyLoadingElm(); 18 scrollLock = false; // コメントを取得して描画した後にスクロールロックを解除する 19 }, 2000); 20 }; 21 22 // コメントを取得して描画する関数(offset=0で最初の10件, offset=10で次の10件...) 23 const getComments = (offset) => { 24 if (!offset) offset = 0; 25 26 fetch(`/questions/${questionId}/comments.json?limit=10&offset=${offset}`).then((response) => { 27 response.json().then((result) => { 28 const { Comments } = result; 29 console.log(Comments); 30 loadCommentsIntoSection(Comments); 31 }); 32 }); 33 }; 34 35 window.onscroll = () => { 36 console.log(scrollLock); 37 // スクロールがロックされているときはデータの取得を中断する 38 if (scrollLock) return; 39 // スクロールバーが画面最下部に移動した時 40 if (this.innerHeight + this.pageYOffset >= document.body.scrollHeight) { 41 fetch(`/questions/${questionId}/comments.json`).then((response) => response.json().then((result) => { 42 const { Comments } = result; 43 const numOfComments = Comments.length; //すべてのコメントの数 44 const commentsLength = document.querySelectorAll('.comment-box').length; // 取得したコメントの数 45 if (numOfComments === commentsLength) return; // 取得したコメント数がすべてのコメント数に達したらデータの取得を中断する 46 scrollLock = true; //コメントを取得している最中はスクロールをロックする 47 getComments(commentsLength); 48 })); 49 } 50 };
基本的にはうまく動作するのですが、たまに同じ範囲のコメントが重複して取得されてしまうので、その原因を特定したいと思っています。
スクロール時にスクロールロックを、コメント取得時に取得したコメントを出力したところ、下画像のように本来falseとtrueの間に10件読み込まれるべきコメントが20件読み込まれています。
怪しいとすればスクロール位置の指定かと思うのですが、自力で原因を把握できなかったため質問させていただきました。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/09/12 06:32