2009-03-14 26 views
0

簡単なフォトギャラリー機能を作りたいと思います。しかし、JQueryのclick()のいくつかの奇妙な動作があります。JQuery click()strange behavior

ユーザーが[進む]ボタンをクリックすると、次の10枚の画像が表示されます。ユーザーが戻るボタンをクリックすると、10枚前の画像が表示されます。

次のコードでは、自分のコードで正常に動作する4行がコメントされています。 JQueryのclick()はコメント行と同じことをするはずですが、そうではありません。 JQuery click()を使用しているコードは、前後に数回クリックすると機能しません。私はコードの問題がどこにあるのか尋ねたい。ありがとうございました。

<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> 

答えて

2

これは、結合事象の正常な動作です:あなたはclickを呼び出すときに、イベントコールバックは、要素とを追加する既存のコールバックを置き換えるものではありません。あなたが前後ボタンを複数回クリックすると、あなたはclickイベントに対して複数のハンドラを割り当て、今はこれが悪いことを知っている:)

あなたには2つのソリューションがあります。問題:

  1. 使用例$('#backward').unbind('click')前あなたは新しいイベントを割り当てますが、これはあなたのコードのための簡単な修正です。
  2. 相対インデックスを持つボタンに1つのイベントのみを割り当てます(例:$('#backward').click(function(){ changeImageList(-10);});)。私はそれがstartIndexを計算するためにchangeImageListの冒頭で簡単にチェックされますが、あなたはまだデフォルト/ポインタにカーソルを設定する必要がありますクリーナーを見つける。