Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   Неправильно срабатывает обработчик событий (https://javascript.ru/forum/events/56013-nepravilno-srabatyvaet-obrabotchik-sobytijj.html)

inflexible 25.05.2015 17:24

Неправильно срабатывает обработчик событий
 
В общем не могу разобраться в чем косяк!
В общем при первом нажатии medals.click все работает отлично, при втором medals.click неправильно работает обработчик rightButtonScroll.click... срабатывает сразу несколько раз и выдает последний результат!

var medals = $(".medalBlock a");
var sportsmen = [medalists.Gold, medalists.Silver, medalists.Bronse];
var num, medalNum;

medals.click(function() {
    
    num = 0;

    if (this === medals[0] ) { medalNum = 0; }
    if (this === medals[1] ) { medalNum = 1; }
    if (this === medals[2] ) { medalNum = 2; }
  
    rotateSportsmenList();

    rightButtonScroll.click(function() {     
        if ((num+1) < sportsmen[medalNum].length) { 
            num++; 
            rotateSportsmenList();
        }
    });

    leftButtonScroll.click(function() {     
        if (num > 0) { 
            num--; 
            rotateSportsmenList(); 
        }
    });

    function rotateSportsmenList(){
        statusScroll.text(num+1 + " из " + sportsmen[medalNum].length);
        nameSportsmenBlock.html(sportsmen[medalNum][num].name);
        $(".sportsmenImgBlock a").css({background: "url("+sportsmen[medalNum][num].imagesURL +") no-repeat"});
        sportsmenBiographyBlock.text(sportsmen[medalNum][num].biography);
    }

});



кстати, раз уже спрашиваю, то почему-то не работает конструкция для данного когда:

for (var i = 0; i < medals.length; i++) {
    (function(k) {
        medals[k].click(function(e) {
         
        });
    })(i);
}


только давайте без мата, и без тупых советов типа "иди еще раз прочитай главу о замыканиях"! если нету желания помочь - то иди себе мимо с Богом!)

рони 25.05.2015 19:32

medals.click при каждом клике добавляет клики для rightButtonScroll и прочего --- строка 36 должна быть в строке 14;
Цитата:

Сообщение от inflexible
кстати, раз уже спрашиваю, то почему-то не работает конструкция для данного когда:

потому что у элемента нет свойства click , а есть onclick

если нужно jquery то medals.eq(i).click или лучше через each а не через for тогда никаких замыканий ненужно

Leon-on12 25.05.2015 19:53

Вот так работает. Что у тебя там не так, разбираться лень.

for (var i = 0; i < medals.length; i++) { (function(){
     medals[i].onclick= (function(){
          alert(this);
     });
};


А в первой части, не могу понять зачем тебе обработчик событий именно внутри этой большой функции. Вынеси их наружу.
Да и rotateSportsmenList() тоже можно вынести.

inflexible 25.05.2015 23:06

Цитата:

Сообщение от рони (Сообщение 372290)
medals.click при каждом клике добавляет клики для rightButtonScroll и прочего --- строка 36 должна быть в строке 14;

блин, благодарка, все правильно ты сказал!) вспомнил, кажись пузырьком называется штука!) вынес все как ты посоветовал и норм работает!)

p.s. всем спасибо, что не прошли мимо!)

kostyanet 27.05.2015 18:59

Цитата:

Сообщение от inflexible
иди еще раз прочитай главу о замыканиях

Все правильно вам советовали. Надо еще раз завернуть все медали в div который и контролировать и тогда не придется развешивать на все медали функцию в цикле. Навскидку останется процентов 10 от этой тряхомудии.


Часовой пояс GMT +3, время: 16:14.