关于这种情况:
[下面是一些html(星级),它们是由php中的foreach循环生成的。所以我有很多班级为rating
的div。 $file_id
是唯一的,并且在每个div中都是不同的!
<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">★</a>
<a href="#4" class="click-trigger star-4" data-value="star-4" data-id="<?php echo $file_id; ?>" title="Vote 4 stars">★</a>
<a href="#3" class="click-trigger star-3" data-value="star-3" data-id="<?php echo $file_id; ?>" title="Vote 3 stars">★</a>
<a href="#2" class="click-trigger star-2" data-value="star-2" data-id="<?php echo $file_id; ?>" title="Vote 2 stars">★</a>
<a href="#1" class="click-trigger star-1" data-value="star-1" data-id="<?php echo $file_id; ?>" title="Vote 1 star">★</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>
我的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>';
问题是:在.rating-votes
类的每个div中都出现回显。但它仅应出现在单击了评级星标之一的div中。
我该如何实现?
要解决此问题,您需要使用jQuery的DOM遍历方法来检索与单击的开始相关的.rating-votes
元素。在这种情况下,请使用closest()
和next()
。
[还要注意,您应该通过将单个公共容器上的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">★</a>
<a href="#4" class="click-trigger star-4" data-value="star-4" title="Vote 4 stars">★</a>
<a href="#3" class="click-trigger star-3" data-value="star-3" title="Vote 3 stars">★</a>
<a href="#2" class="click-trigger star-2" data-value="star-2" title="Vote 2 stars">★</a>
<a href="#1" class="click-trigger star-1" data-value="star-1" title="Vote 1 star">★</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);
}
});
});