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

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

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

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

JavaScript

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

Ajax

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

Q&A

解決済

2回答

414閲覧

無限スクロールで途中から同じコンテンツが表示される

homepage-site

総合スコア40

PHP

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

JavaScript

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

Ajax

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

0グッド

1クリップ

投稿2024/07/18 12:36

実現したいこと

無限スクロールで画像と文字を表示させたいです。

発生している問題・分からないこと

68コンテンツを無限スクロールで表示したいのですが60までしか表示されない原因と、何度も同じコンテンツが表示される原因が分かりません。

該当のソースコード

que_list.php

1<?php 2/* 3Template Name: que_list 4固定ページ: 質問一覧画面 5*/ 6get_header(); 7?> 8<div id="feed4-layout"> 9 <div class="image-inline-player"></div> 10 <div class="footer-test"> 11 <p>© All rights reserved by dmmwebcampmedia.</p> 12 </div> 13</div> 14<script> 15 var count = 0; 16 $(function() { 17 add() 18 $(window).on("scroll", function() { 19 if ($(window).scrollTop() + $(window).height() >= $("html").height()) { 20 add() 21 } 22 }) 23 }); 24 25 function add() { 26 const formData = new FormData(); 27 formData.append("action", "bbs_que_list_items"); 28 formData.append("count", count); 29 var url = '/groups/' + group_id + '/messages.json' 30 const opt = { 31 method: "post", 32 body: formData 33 } 34 fetch("<?php echo home_url('wp-admin/admin-ajax.php'); ?>", opt) 35 .then(response => { 36 return response.json(); 37 }) 38 .then(json => { 39 for (let idx = 0; idx < json.items.length; idx++) { 40 count++; 41 const item = json.items[idx]; 42 const imageCardWrap = document.createElement("div"); 43 imageCardWrap.classList.add("image-card-wrap"); 44 imageCardWrap.style.display = "inline-block"; 45 const link = document.createElement("a"); 46 link.href = item.url; 47 const imageThumbnailCard = document.createElement("div"); 48 imageThumbnailCard.classList.add("image-thumbnail-card"); 49 if (item.type == "img") { 50 const img = document.createElement("img"); 51 //img.style.height = "150px"; 52 //img.style.width = "260px"; 53 img.src = item.img1; 54 imageThumbnailCard.appendChild(img); 55 } else if (item.type == "video") { 56 const video = document.createElement("video"); 57 //video.style.height = "150px"; 58 //video.style.width = "260px"; 59 video.src = item.img1 + "#t=0.1"; 60 imageThumbnailCard.appendChild(video); 61 } else if (item.type == "iframe") { 62 const iframe = document.createElement("iframe"); 63 //iframe.style.height = "150px"; 64 //iframe.style.width = "260px"; 65 iframe.src = item.img1; 66 imageThumbnailCard.appendChild(iframe); 67 } else { 68 const img = document.createElement("img"); 69 //img.style.height = "150px"; 70 //img.style.width = "260px"; 71 img.src = "../wp-content/themes/sample_theme/images/alternative.png"; 72 imageThumbnailCard.appendChild(img); 73 } 74 link.appendChild(imageThumbnailCard); 75 const imageTitleLink = document.createElement("div"); 76 imageTitleLink.classList.add("image-title-link"); 77 imageTitleLink.textContent = truncate(item.title, 20); 78 link.appendChild(imageTitleLink); 79 imageCardWrap.appendChild(link); 80 $(".image-inline-player").append(imageCardWrap); 81 } 82 }) 83 .catch(error => { 84 console.log(error); 85 }); 86 }; 87 88 function truncate(str, len) { 89 return str.length <= len ? str : (str.substr(0, len) + "..."); 90 }; 91<script>

functions.php

1//質問掲示板一覧表示 2function bbs_que_list_items() 3{ 4 global $wpdb; 5 $count = $_POST['count']; 6 $sql = 'SELECT * FROM sortable LIMIT %d,10'; 7 $query = $wpdb->prepare($sql, $count); 8 $rows = $wpdb->get_results($query); 9 $result = []; 10 foreach ($rows as $row) { 11 $result['items'][] = ['title' => $row->title, 'img1' => '画像'.$row->ID]; 12 } 13 echo json_encode($result); 14 exit; 15} 16add_action('wp_ajax_bbs_que_list_items', 'bbs_que_list_items'); 17add_action('wp_ajax_nopriv_bbs_que_list_items', 'bbs_que_list_items');

試したこと・調べたこと

  • teratailやGoogle等で検索した
  • ソースコードを自分なりに変更した
  • 知人に聞いた
  • その他
上記の詳細・結果

スクロールを発生させるまでのコンテンツ数を広げてみたところ表示されるようになった種類が増えただけでした。

imageTitleLink.textContent = truncate(item.title, 30);

補足

※参考サイト
https://www.agent-grow.com/self20percent/2021/08/03/php%E3%81%A8ajax%E3%81%A7%E7%84%A1%E9%99%90%E3%82%B9%E3%82%AF%E3%83%AD%E3%83%BC%E3%83%AB%E5%AE%9F%E8%A3%85%E3%81%97%E3%81%A6%E3%81%BF%E3%81%9F/

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

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

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

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

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

tabuu

2024/07/19 02:08

add処理が完了する前にadd処理が呼び出されているのではないでしょうか? add関数が想定しているタイミングで呼び出されているか確認してみてください。
yambejp

2024/07/19 03:16

「何度も同じコンテンツが表示される」 って無限スクロールはむしろそういう意図ではないのでしょうか?
homepage-site

2024/07/19 06:18

tabuuさんアドバイスありがとうございます。 add関数が想定しているタイミングで呼び出されているか確認する方法が分からないのですが、どうすれば良いのでしょうか?
tabuu

2024/07/19 07:26

とりあえずadd関数内でconsole.log('test')と固定の文字を出力するようにしてデベロッパーツールでコンソールを開きながらページをスクロールして確認するところから始めてはいかがでしょうか。
homepage-site

2024/07/27 10:03

tabuuさんアドバイスありがとうございます。 add処理中かどうか確認したところエラーが出ておりました。 無限スクロールでコンテンツの終わりに達していた際に、json.items がないため length プロパティにアクセスできなかったようです。 ※修正コード for (let idx = 0; idx < json.items.length; idx++) { let count = 0; //countから変更 let adding = false; //add処理判定フラグ(初期値:add未処理に設定) $(function() { add() $(window).on("scroll", function() { if ($(window).scrollTop() + $(window).height() >= $("html").height()) { add() } }) }); function add() { //add処理判定 if (adding) { //add処理中のため抜ける return; } adding = true; //add処理中に設定 const formData = new FormData(); formData.append("action", "bbs_que_list_items"); formData.append("count", count);
guest

回答2

0

おそらく高さの計算がおかしいのだと思いますが再現できないのでなんとも言えません。
jsonを元に処理しているのであればscrollでaddさせるのは無意味だと思います。
(同じjsonを取得するなら前のjsonを再利用すればよいような・・・)

参考

高さで計算するのではなく交差で追加を判断すればよいかも

html

1<script> 2window.addEventListener('DOMContentLoaded', ()=>{ 3 const json_data=[1,2,3,4,5]; // jsonのデータは初回一回読めば良い 4 const add=()=>{ 5 json_data.forEach(x=>document.querySelector('footer').before(Object.assign(document.createElement('div'),{className:"dummy",textContent:x}))); 6 } 7 const io=()=>{ 8 const observer = new IntersectionObserver(changes=>{ 9 for (let change of changes) { 10 if(change.intersectionRatio > 0) add(); 11 } 12 }); 13 observer.observe(document.querySelector('footer')); 14 } 15 io(); 16}); 17</script> 18<style> 19.dummy{ 20height:80%; 21} 22.dummy:nth-child(odd){ 23 background-Color:gray; 24} 25</style> 26<body> 27<footer>footer</footer> 28</body>

投稿2024/07/19 00:19

編集2024/07/19 02:53
yambejp

総合スコア115870

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

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

yambejp

2024/07/19 02:54

高さで判定しない処理を参考で上げておきました
homepage-site

2024/07/19 06:28

アドバイスありがとうございます。 1つお聞きしたいのですが、json_data の数を不特定多数にすることは可能でしょうか? 作成中の質問掲示板は1週間を期限に投稿された質問の数になる為、無限スクロールが何件になるか分からない状態です。
yambejp

2024/07/19 06:32

jsonをfetchのたびに更新する想定であればadd内でjson_dataを取得すればよいでしょう。
homepage-site

2024/07/27 10:10

yambejp さんアドバイスありがとうございます。 高さの計算について調べてみたところ、同様のコードで console を用いて確認されている方がおられたので、問題は tabuu さんにアドバイス頂いた add 処理にありました。 1スクロールが終わった際に json.items がないため length プロパティにアクセスできなかったようです。
guest

0

自己解決

add関数が想定しているタイミングで呼び出されているか確認したところ、
1スクロールが終わった際に json.items がないため length プロパティにアクセスできなかったようです。
for (let idx = 0; idx < json.items.length; idx++) { でエラーが発生しており、データがなかった場合は、json.itemsを要素ゼロの配列になるようにしておくことで正しく表示されました。

※エラー文
TypeError: Cannot read properties of undefined (reading 'length')

que_list.php

for (let idx = 0; idx < json.items.length; idx++) { let count = 0; //countから変更 let adding = false; //add処理判定フラグ(初期値:add未処理に設定) $(function() { add() $(window).on("scroll", function() { if ($(window).scrollTop() + $(window).height() >= $("html").height()) { add() } }) }); function add() { //add処理判定 if (adding) { //add処理中のため抜ける return; } adding = true; //add処理中に設定 const formData = new FormData(); formData.append("action", "bbs_que_list_items"); formData.append("count", count);

functions.php

function bbs_que_list_items() { global $wpdb; $count = $_POST['count']; $sql = 'SELECT * FROM sortable LIMIT %d,10'; $query = $wpdb->prepare($sql, $count); $rows = $wpdb->get_results($query); $result = []; $result['items'] = []; $upload_dir = wp_upload_dir();

投稿2024/07/27 10:18

編集2024/07/27 10:20
homepage-site

総合スコア40

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.40%

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

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

質問する

関連した質問