как отправить ajax обратный вызов в указанный c div, которые генерируются циклом foreach - PullRequest
3 голосов
/ 19 марта 2020

Это примерно такая ситуация:

Ниже приведены некоторые html (звездочки рейтинга), которые генерируются foreach l oop в php. Так что у меня много дел с классом rating. $file_id уникален и в каждом отдельном элементе!

<div class="rating" data-rating="<?php echo $round;?>">
    <div class="rating-stars">                  
        <a href="#5" class="click-trigger star-5" data-value="star-5" data-id="<?php echo $file_id; ?>" title="Vote 5 stars">&#x2605</a>
        <a href="#4" class="click-trigger star-4" data-value="star-4" data-id="<?php echo $file_id; ?>" title="Vote 4 stars">&#x2605</a>
        <a href="#3" class="click-trigger star-3" data-value="star-3" data-id="<?php echo $file_id; ?>" title="Vote 3 stars">&#x2605</a>
        <a href="#2" class="click-trigger star-2" data-value="star-2" data-id="<?php echo $file_id; ?>" title="Vote 2 stars">&#x2605</a>
        <a href="#1" class="click-trigger star-1" data-value="star-1" data-id="<?php echo $file_id; ?>" title="Vote 1 star">&#x2605</a>
    </div>
    <div class="rating-votes">
        Average: <span id="count-avg"><?php echo $avg;?></span> Votes: <span id="count-total"><?php echo array_sum($count);?></span>
    </div>

</div>

My jquery ajax выглядит следующим образом:

$('.click-trigger').on('click', function(e) {
    e.preventDefault(); 

    var value = $(this).data('value');
    var file_id = $(this).data('id');

    $.ajax({
        url: 'counter.php',
        type: 'POST',
        data: { 
            value:value,
            file_id:file_id         
            },
        success: function(data){
            $('.rating-votes').html(data);

        }
    });

});

И файл counter. php делает это эхо как обратный вызов:

echo '<div class="text-success">Thanks for voting!</div>';

Проблема: в каждом div с классом .rating-votes появляется эхо. Но он должен отображаться только в том диве, на котором нажата одна из звезд рейтинга.

Как мне этого добиться?

1 Ответ

2 голосов
/ 19 марта 2020

Чтобы это исправить, вам нужно использовать jQuery методы обхода DOM для получения элемента .rating-votes, относящегося к началу, по которой был нажат. В этом случае используйте closest() и next().

Также обратите внимание, что вы должны DRY код, добавив атрибут data-id в одном общем контейнере к элементам .click-trigger вместо повторения это на каждом. Попробуйте это:

<div class="rating" data-rating="<?php echo $round;?>">
  <div class="rating-stars" data-id="<?php echo $file_id; ?>">
    <a href="#5" class="click-trigger star-5" data-value="star-5" title="Vote 5 stars">&#x2605</a>
    <a href="#4" class="click-trigger star-4" data-value="star-4" title="Vote 4 stars">&#x2605</a>
    <a href="#3" class="click-trigger star-3" data-value="star-3" title="Vote 3 stars">&#x2605</a>
    <a href="#2" class="click-trigger star-2" data-value="star-2" title="Vote 2 stars">&#x2605</a>
    <a href="#1" class="click-trigger star-1" data-value="star-1" title="Vote 1 star">&#x2605</a>
  </div>
  <div class="rating-votes">
    Average: <span id="count-avg"><?php echo $avg;?></span> Votes: <span id="count-total"><?php echo array_sum($count);?></span>
  </div>
</div>
$('.click-trigger').on('click', function(e) {
  e.preventDefault();
  let $star = $(this);
  let $container = $star.closest('.rating-stars');

  $.ajax({
    url: 'counter.php',
    type: 'POST',
    data: {
      value: $star.data('value'),
      file_id: $container.data('id')
    },
    success: function(data) {
      $container.next('.rating-votes').html(data);
    }
  });
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...