JQuery click () странное поведение - PullRequest
0 голосов
/ 14 марта 2009

Я хочу сделать простую функцию фотогалереи. Однако есть некоторое странное поведение click () в JQuery.

После того, как пользователь нажмет кнопку «Вперед», должно появиться 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>

1 Ответ

2 голосов
/ 14 марта 2009

Это нормальное поведение привязки события: когда вы вызываете click, обратный вызов события добавляет к элементу и не заменяет существующих обратных вызовов. Когда вы нажимаете кнопки «назад» и «вперед» несколько раз, вы назначаете несколько обработчиков для события click, и теперь вы знаете, что это плохо:)

Есть два решения вашей проблемы:

  1. используйте, например, $('#backward').unbind('click') перед назначением нового события, это простое исправление для вашего кода.
  2. назначить только одно событие кнопкам с относительным индексом, например, $('#backward').click(function(){ changeImageList(-10);});. Я считаю, что чище будет простая проверка в начале changeImageList для вычисления startIndex, но вам все равно придется установить курсор на default / pointer.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...