実現したいこと
現状1ページに口コミは2件あります。
例えば1件目の口コミがone_review、2件目の口コミがのtwo_reviewとすると
one_reviewに対してコメントを投稿しても、one_reviewとtwo_review両方にコメントが表示されてしまいます。
リロード(更新)すると正常に表示されている為、DBにajaxから送信したデータは入っていると思われます。
ajax(非同期処理)を利用して、口コミに対するコメントをそれぞれ画面遷移せずに表示させたいです。
DBには口コミテーブルと口コミに対するコメントテーブルがあり、ajaxを使わない(画面遷移する)状態であればこの機能は実装できております。
jquery(ajax)を使っています。
現状とソースコード
・口コミの投稿フォームもあり、投稿する度に口コミも増え続けます。
・ページネーションしており、1ページには2件ずつ口コミが表示される。
・その口コミに対するコメントをコメントフォームから投稿すると口コミの下部にコメントが表示される。
・1ページに口コミの投稿フォーム、口コミの表示、コメントの投稿フォーム、コメントの表示があります。
コメント投稿ボタンがあるHTML
<form onsubmit="return false;"> <input type="text" name="name"> <textarea name="comment"></textarea> <button class="koment">投稿する</button> </form>
口コミに対するコメントを表示させたいHTML
<div class="replyList"> <ul class="komlist"> <php foreach($comment as $c) { ?> <li> <p><?= $c['name'] ?></p> <p><?= $c['comment'] ?></p> </li> <?php } ?> </ul> </div>
ajax(jquery)のソースコード
$(document).on('click','.koment',function(){ $.ajax({ url:'/comment/comment', type:'POST', data:{ name: $(this).closest('#kom').find('#komname').val(), comment: $(this).closest('#kom').find('#komtext').val(), review_id: $(this).closest('#kom').find('#review_id').val(), }, dataType: 'json' }) // Ajax通信が成功したら発動 .done(function(data, dataType){ $('.komlist').prepend( '<li>'+ '<p>'+ data['name'] +'</p>'+ '<p>'+ data['comment']+ '</p>'+ '</li>' ) }) });
で新しいコメント順でコメントを表示させています。
しかし、これだと1件コメントを投稿すると、1ページに2件口コミがあるので、そのどちらにもコメントが表示されてしまいます。
試したこと
現状は('.komlist')でprependするセレクタを指定しているのですが、class="komlist"には2件ずつ口コミがあるため、そのどちらにも投稿したコメントが1件ずつ表示されてると考えました。
コメント投稿した箇所にだけコメントを表示させたいため、クリックした要素のthisを使って
$(this).closest('.replyList').find('.komlist').prepend()
や
$(this).parents().find('.komlist').prepend()
を試してみましたが、こうすると動かなくなります。更新すると正常表示になります。
this以下の書き方が違うと思いますが、どこが違うのかわからないでいます。
=====[追記]===================================
.komentは投稿ボタン<button>に付与されているclass="koment"になります。
.komlistはコメントを表示する際の<ul>に付与されているclass="komlist"になります。
.komentと.komilistはhtml構造上では、親が同じの兄弟要素です。
<li> <div class="replyList box"> <p class="replyTitle">コメント表示</p> <ul class="komlist"> <li class="r-list"> <div> <p><?= $c['name'] ?></p> <div> <?= $c['comment'] ?> </div> </div> </li> </ul> </div> <div class="replyForm"> <p class="replyFormTitle">コメント投稿</p> <form onsubmit="return false;"> <input type="text" id="komname" name="name"> <textarea name="comment" id="komtext"></textarea> <button class="koment">投稿する</button> </form> </div> </li>
複数ある場合は、どの様に複数なのか。例:仮に口コミが2つある場合。
<ul class="prepend"> //1つ目の口コミ <li> <div class="main">口コミ1</div> <div class="detail">Aさん コメント1</div> <div class="replyList box"> <p class="replyTitle">コメント表示</p> //1つ目の口コミに対するコメント1 <ul class="komlist"> <li class="r-list"> <div> <p><?= $c['name'] ?></p> <div> <?= $c['comment'] ?> </div> </div> </li> //1つ目の口コミに対するコメント2以降.. <li class="r-list"> <div> <p><?= $c['name'] ?></p> <div> <?= $c['comment'] ?> </div> </div> </li> //...と上記の様に<li>が増えていく感じです </ul> </div> <div class="replyForm"> <p class="replyFormTitle">コメント投稿</p> <form onsubmit="return false;"> <input type="text" id="komname" name="name"> <textarea name="comment" id="komtext"></textarea> <button class="koment">投稿する</button> </form> </div> </li> //2つ目の口コミ <li> <div class="main">口コミ2</div> <div class="detail">Bさん コメント2</div> <div class="replyList box"> <p class="replyTitle">コメント表示</p> //2つ目の口コミに対するコメント1 <ul class="komlist"> <li class="r-list"> <div> <p><?= $c['name'] ?></p> <div> <?= $c['comment'] ?> </div> </div> </li> //2つ目の口コミに対するコメント2以降 <li class="r-list"> <div> <p><?= $c['name'] ?></p> <div> <?= $c['comment'] ?> </div> </div> </li> </ul> </div> <div class="replyForm"> <p class="replyFormTitle">コメント投稿</p> <form onsubmit="return false;"> <input type="text" id="komname" name="name"> <textarea name="comment" id="komtext"></textarea> <button class="koment">投稿する</button> </form> </div> </li> //...口コミが増えていくたびに<ul class="prepend">以下の<li>要素が増えていきます。 </ul>
回答2件
あなたの回答
tips
プレビュー