Reputation: 1057
Im using jQuery Masonry and another javascript for voting. here is the code
<div id="contain">
<?php
$result = $mysqli->query("SELECT * FROM posts ORDER BY id DESC LIMIT 0, 20");
while($row = mysqli_fetch_array($result))
{
$mes_id = $row['id'];
$up = $row['likes'];
?>
<div class="box">
<img src="images/<?php echo $row['image']; ?>"/>
<div class='up'>
<a href="" class="like" id="<?php echo $mes_id;?>" name="up"><?php echo $up; ?></a>
</div><!--box-->
<?php } ?>
</div>
<nav id="page-nav">
<a href="data_index.php?page=2"></a>
</nav>
<script>
$(function() {
$(".like").click(function()
{
var id = $(this).attr("id");
var name = $(this).attr("name");
var dataString = 'id='+ id ;
var parent = $(this);
if (name=='up')
{
$(this).fadeIn(200).html;
$.ajax({
type: "POST",
url: "vote.php",
data: dataString,
cache: false,
success: function(html)
{
parent.html(html);
}
});
}
return false;
});
});
</script>
<script src="js/jquery.masonry.min.js"></script>
<script src="js/jquery.infinitescroll.min.js"></script>
<script>
$(function(){
var $container = $('#contain');
$container.imagesLoaded(function(){
$container.masonry({
itemSelector : '.box',
columnWidth : 305
});
});
$container.infinitescroll({
navSelector : '#page-nav', // selector for the paged navigation
nextSelector : '#page-nav a', // selector for the NEXT link (to page 2)
itemSelector : '.box', // selector for all items you'll retrieve
loading: {
finishedMsg: 'No more posts to load.',
img: 'templates/<?php echo $settings['template'];?>/images/ajax-loader.gif'
}
},
// trigger Masonry as a callback
function( newElements ) {
var $newElems = $( newElements );
$newElems.imagesLoaded(function(){
$container.masonry( 'appended', $newElems );
//Voting
$(".like").click(function()
{
var id = $(this).attr("id");
var name = $(this).attr("name");
var dataString = 'id='+ id ;
var parent = $(this);
if (name=='up')
{
$(this).fadeIn(200).html;
$.ajax({
type: "POST",
url: "vote.php",
data: dataString,
cache: false,
success: function(html)
{
parent.html(html);
}
});
}
return false;
});
//End voting
});
});
});
</script>
As you can see i have added the same javascript two times. and in the 1st page when voting click it script is voting 2 times. but if i remove the 1st javascript for the vote it will only work in the 2nd page. and if i remove the 2nd javascript voting will only work in the 1st page. this 2 time voting happen only when the 2nd page loads. can anyone help me with this problem.
This is the voting javascript so you can see it easily
<script>
$(function() {
$(".like").click(function()
{
var id = $(this).attr("id");
var name = $(this).attr("name");
var dataString = 'id='+ id ;
var parent = $(this);
if (name=='up')
{
$(this).fadeIn(200).html;
$.ajax({
type: "POST",
url: "vote.php",
data: dataString,
cache: false,
success: function(html)
{
parent.html(html);
}
});
}
return false;
});
});
</script>
Upvotes: 0
Views: 240
Reputation: 1331
try $(".like").on('click',function()
instead of $(".like").click(function()
Upvotes: 0
Reputation:
<script>
$(function(){
var $container = $('#contain');
$container.imagesLoaded(function(){
$container.masonry({
itemSelector : '.box',
columnWidth : 305
});
});
$container.infinitescroll({
navSelector : '#page-nav', // selector for the paged navigation
nextSelector : '#page-nav a', // selector for the NEXT link (to page 2)
itemSelector : '.box', // selector for all items you'll retrieve
loading: {
finishedMsg: 'No more posts to load.',
img: 'templates/<?php echo $settings['template'];?>/images/ajax-loader.gif'
}
},
// trigger Masonry as a callback
function( newElements ) {
var $newElems = $( newElements );
$newElems.imagesLoaded(function(){
$container.masonry( 'appended', $newElems );
//Voting
$(".like").click(function()
{
var id = $(this).attr("id");
var name = $(this).attr("name");
var dataString = 'id='+ id ;
var parent = $(this);
if (name=='up')
{
$(this).fadeIn(200).html;
$.ajax({
type: "POST",
url: "vote.php",
data: dataString,
cache: false,
success: function(html)
{
parent.html(html);
}
});
}
return false;
});
//End voting
});
});
});
</script>
<div id="contain">
<?php
$result = $mysqli->query("SELECT * FROM posts ORDER BY id DESC LIMIT 0, 20");
while($row = mysqli_fetch_array($result))
{
$mes_id = $row['id'];
$up = $row['likes'];
?>
<div class="box">
<img src="images/<?php echo $row['image']; ?>"/>
<div class='up'>
<a href="" class="like" id="<?php echo $mes_id;?>" name="up"><?php echo $up; ?></a>
</div><!--box-->
<?php } ?>
</div>
<nav id="page-nav">
<a href="data_index.php?page=2"></a>
</nav>
Upvotes: 0
Reputation: 48982
The reason for voting 2 times is you're attaching the event handlers for the $(".like").click
twice. When a .like
is clicked, it will execute all the event handlers attached.
if i remove the 1st javascript for the vote it will only work in the 2nd page and if i remove the 2nd javascript voting will only work in the 1st page. this 2 time voting happen only when the 2nd page loads
This is because you have dynamically create elements on the page. I suggest using delegated event handlers instead ($.on).Try:
$("#contain").on("click",".like",function(){
});
Remember to execute this script only once
Upvotes: 1