2009-03-14 7 views
0

Je veux faire une fonction de galerie photo simple. Cependant, il existe un comportement étrange du clic de JQuery(). Lorsque l'utilisateur clique sur le bouton Suivant 10, les images suivantes doivent être affichées. Après que l'utilisateur clique sur le bouton arrière, 10 images précédentes devraient être montrées.JQuery click() étrange comportement

Dans le code suivant, 4 lignes qui fonctionnent bien dans mon code sont commentées. Je m'attends à ce que le JQuery click() fasse la même chose que les lignes commentées, mais ce n'est pas le cas. Le code utilisant JQuery click() ne fonctionne pas après avoir cliqué plusieurs fois en arrière et en avant. Je veux demander où est le problème du code. Je vous remercie.

<script type="text/javascript"> 
$(document).ready(function() { 

var numImages = imagesObj.images.image.length; 
var imagePath = "images/"; 
var currentIndex = 0; 


function changeImageList(startIndex){ 

    var imageIndex = 0; 
    $("#imagesList img").css("display","none"); 
    for (var i=startIndex; i<numImages && i<startIndex + 10; i++) 
    { 
     var imageId = "image" + imageIndex; 
     var image = imagesObj.images.image[i]; 

     $("#" + imageId).attr("src",imagePath + image.imageurl).css("display",""); 

     imageIndex++; 
    } 

    currentIndex = startIndex; 
    if (numImages > currentIndex+10){ 
     $('#forward').css("cursor","pointer"); 
     //document.getElementById("forward").onclick = function(){changeImageList(currentIndex+10);}; 
     $('#forward').click(function(){ changeImageList(currentIndex+10);}); 
    }else{ 
     $('#forward').css("cursor","default"); 
     //document.getElementById("forward").onclick = function(){}; 
     $('#forward').click(function(){}); 
    } 

    if (currentIndex < 10){ 
     $('#backward').css("cursor","default"); 
     //document.getElementById("backward").onclick = function(){}; 
     $('#backward').click(function(){}); 
    }else{ 
     $('#backward').css("cursor","pointer"); 
     //document.getElementById("backward").onclick = function(){changeImageList(currentIndex-10);}; 
     $('#backward').click(function(){changeImageList(currentIndex-10);}); 

    } 
} 

    changeImageList(0); 

}); 

</script> 

</head> 
<body> 
<table border="0" cellpadding="0" cellspacing="0"> 
     <tr> 
     <td align="center"><img id="backward" src="images/lft_arrow.gif" alt="" width="39" height="44" /></td> 
     <td id="imagesList" align="center"> 
     <img id="image0" width="77" style="display:none; cursor:pointer" /> 
     <img id="image1" width="77" style="display:none; cursor:pointer" /> 
     <img id="image2" width="77" style="display:none; cursor:pointer" /> 
     <img id="image3" width="77" style="display:none; cursor:pointer" /> 
     <img id="image4" width="77" style="display:none; cursor:pointer" /> 
     <img id="image5" width="77" style="display:none; cursor:pointer" /> 
     <img id="image6" width="77" style="display:none; cursor:pointer" /> 
     <img id="image7" width="77" style="display:none; cursor:pointer" /> 
     <img id="image8" width="77" style="display:none; cursor:pointer" /> 
     <img id="image9" width="77" style="display:none; cursor:pointer" /> 
     </td> 
     <td align="center"><img id="forward" src="images/rgt_arrow.gif" alt="" width="39" height="44" /></td> 
     </tr> 
    </table> 
</body> 

Répondre

2

Ce comportement est normal de liaison d'événement: lorsque vous appelez click, le rappel d'événement est ajouté à l'élément et ne remplace pas callbacks existants. Lorsque vous cliquez sur les boutons arrière et en avant plusieurs fois, vous affectez plusieurs gestionnaires pour l'événement click et maintenant vous savez que cela est mauvais :)

Il y a deux solutions pour problème:

  1. utilisation par exemple $('#backward').unbind('click') avant vous affectez un nouvel événement, c'est la solution facile pour votre code.
  2. affecter un seul événement aux boutons avec un index relatif, par exemple $('#backward').click(function(){ changeImageList(-10);});. Je trouve cela plus simple une vérification simple au début de changeImageList pour calculer startIndex, mais vous devrez toujours placer le curseur sur défaut/pointeur.