Система комментариев с интеграцией ответов с использованием jQuery и PHP

В настоящее время я работаю над проектом системы комментариев. Я могу написать комментарий, сохранить его в своей базе данных, получить обратно и отобразить на веб-странице. Но затем у меня возникают проблемы, когда я включаю функцию ответа на комментарий поверх моей существующей системы комментариев. Проблема 1: я создал 2 новых интерактивных элемента под каждым из блоков комментариев, первый из них — «нет ответов», который показывает новые ответы. Во-вторых, «ответить сейчас», это текстовое поле, в котором пользователи могут ответить на этот комментарий. Однако, когда я нажимаю на любой из них, все интерактивные элементы открываются в остальных разделах комментариев, а не только тот, на который я нажимаю. Проблема 2: я могу ответить и отправить свой ответ в базу данных только в самом последнем комментарии div. Когда я пытаюсь ответить на старый комментарий, страница обновляется, и ничего не записывается в базу данных. Ниже мои разметки. Извините, если это сбивает с толку, но английский не мой родной язык. Мы будем признательны за любой вклад.

<div class="timeline">

    <?php $stmt = $DB->query("CALL get_comment($aid)");
      $results = $stmt->fetchAll(); $stmt->closeCursor();
      foreach ($results as $info) {
      ?>

        <div class="commentBox">
            //The comment markup

             <p class="allreplys">Replys</p> //This opens all replys
             <p class="replyButton">Reply me</p> //This opens reply form

           <form class="replySection">
           //The reply form markup
           </form>

          <div class="replyTimeline">
            <?php
               $stmt = $DB->query<"CALL get_reply('$aid','$pid')");
               $replys = $stmt->fetchAll(); $stmt->closeCursor();
               foreach ($replys as $re) {
               ?>
                    <div class="replyBox>
                      //Reply Markups
                    </div>
               <?php } ?> //Close of reply foreach
           </div> //Close of replyTimeline

       </div> //Close of commentBox

   <?php } ?> //Close of comment foreach

</div> //Close of timeline

Ниже приведена моя разметка jQuery.

$(document).ready(function() {
    $('.allreplys').click(function(event) {
       $('.replyline').toggle();
    });
    $('.replyButton').click(function(event) {
       $('.replySection').toggle();
    });
});

person Ray Wai    schedule 19.10.2015    source источник
comment
селектор $(.replySection) будет соответствовать всем элементам с этим именем класса, если вам нужен определенный, попробуйте что-то вроде $(this).parent().find(.replySection).toggle(). Это означает, что если нажата определенная кнопка, перейдите к своему родительскому узлу, то есть commentBox, затем найдите элемент с классом replySection и переключите только его. Я едва посмотрел на это, так что это не обязательно подходит для вашего случая, но, надеюсь, вы сможете адаптировать его к своим потребностям.   -  person AndrewB    schedule 19.10.2015
comment
Привет, спасибо за ваш ответ. Однако добавление этого фрагмента кода в селектор делает переключение не отвечающим   -  person Ray Wai    schedule 19.10.2015
comment
возможно: $(this).parent(.commentBox).find(.replySection).toggle(); ?   -  person AndrewB    schedule 19.10.2015


Ответы (1)


Это работает лучше?

Моя цель — сузить используемый вами селектор, который в настоящее время выбирает все элементы всей страницы с именем класса «allreplys» или «replyButton». Используя $(this).parent(".commentBox").find(...

$(this) относится к нажатой кнопке, в данном случае это тег p. "parent(...)" перемещается вверх по дереву узлов, чтобы добраться до тега с именем класса ".commentBox", а find(...) будет искать элемент с селектором, заданным в этом узле и его дочерних элементах (и их дети и т. д. и т. д. (рекурсивный)). Надеюсь, только переключение одного элемента вместо всех.

Хотя я не вижу в вашем коде класса под названием «ответная линия», так что это может быть точкой отказа.

$(document).ready(function() {
    $('.allreplys').click(function(event) {
       $(this).parent(".commentBox").find(".replyline").toggle();
    });
    $('.replyButton').click(function(event) {
       $(this).parent(".commentBox").find(".replySection").toggle();
    });
});
person AndrewB    schedule 19.10.2015
comment
Здравствуйте, еще раз спасибо, я вижу, что вы пытаетесь сделать сейчас. «Линия ответов» на самом деле есть, но вместо этого я поставил «ответную временную шкалу» в своем исходном сообщении, это моя ошибка. К сожалению, он вообще не отвечает, я даже пытаюсь перейти на родительский уровень на «временную шкалу» вместо «commentBox», но ответа все равно нет. - person Ray Wai; 19.10.2015
comment
Я получаю тот ответ, который хотел в этом JSfiddle: jsfiddle.net/7rq6ovqp Я сомневаюсь, что это причина вашей ошибки, но в ‹div class=replyBox› отсутствует закрывающая цитата. Сможете ли вы создать JSfiddle html-контент результирующей страницы вашего кода? - person AndrewB; 19.10.2015
comment
Эндрю, после некоторых проб и ошибок я, наконец, заставил его работать, проблема, с которой я столкнулся, заключалась в том, что на самом деле был еще один div с именем replyBar вокруг «allReplys» и «replyButton», а также еще один div прямо внутри commentBox с именем InsertBox. Прошу прощения, что не упомянул об этом раньше, так как думал, что это не имеет значения. Пересмотренный код javascript выглядит следующим образом: ).переключать();}); - person Ray Wai; 20.10.2015
comment
Рад, что это помогло. Лучше всего дать людям как можно больше информации, когда задаете вопросы, так как вы никогда не знаете, где на самом деле лежит корень проблемы :) - person AndrewB; 20.10.2015
comment
Вы знаете, как создать чат? Я не знаком с этим, но лучше им воспользоваться, чем долго болтать в комментариях - person AndrewB; 20.10.2015
comment
Эндрю, извини, я не был рядом с моим компьютером весь день, кстати, у меня недостаточно репутации для использования чата... В любом случае, я на самом деле использую jQuery для отправки информации POST в базу данных, что-то вроде следующего: var form = $('#replyForm; var submit = $('.rSubmit'); form.on('submit', function() {$.ajax({ url:ajax_reply.php, type:'post', cache: ложь, данные: form.serialize(), успех: ... - person Ray Wai; 21.10.2015
comment
Когда я печатал приведенный выше комментарий, я понял, что моя проблема заключается в том, что я объявлял идентификатор для своей формы, но на самом деле я должен был сделать его классом, например, var form = $('.replyForm '); Я вижу, что теперь я могу заставить свой jQuery реагировать на все мои другие кнопки отправки окна ответа. - person Ray Wai; 21.10.2015
comment
Помните, что использование селектора, такого как $('.rSubmit') или $('.replyForm'), будет соответствовать всем им на странице, вам нужно сузить свой селектор, как вы сделали в предыдущем примере. Посмотрите документацию для родителя, найдите функции и поймите, как они работают. концепция должна быть такой же, как и в первом выпуске, так что это просто вопрос ее изменения. - person AndrewB; 21.10.2015
comment
Я вижу, спасибо еще раз. Итак, вы говорите, что я должен указать каждый дочерний класс отправки $('.rSubmit') в его собственную родительскую форму ответа $('.replyForm')? И способ сделать это похож на способ, который вы показали мне в моей первой задаче? - person Ray Wai; 24.10.2015