Обработка нескольких вызовов setInterval

#javascript #event-handling #refactoring #setinterval

#javascript #обработка событий #рефакторинг #setinterval

Вопрос:

У меня возникли проблемы с разработкой того, как создать простой всплывающий эффект для класса divs. Поскольку события onmouseover каждого из элементов в этом классе в настоящее время вызывают одну и ту же функцию, быстрое переключение между разделами оставляет предыдущий div застрявшим на полпути (если вы включаете и выключаете мышь в нижней части div, вы увидите эффект, который я пытаюсь произвести).

Мой текущий подход также требует, чтобы я копировал довольно много кода для вызова функции из обработчиков событий каждого отдельного div, поэтому, если есть способ объединить их в одну функцию, я действительно хотел бы знать, как. Я уверен, что есть простой и эффективный способ сделать все это, просто, похоже, не могу с этим справиться.

Пример jsFiddle: http://jsfiddle.net/DvXDb /

Вот мой код (скрипт внизу):


 div.bouncer{
       position:relative;
        top:50px;
    }




    function next(elem) {
        do {
            elem = elem.nextSibling;
        } while (elem amp;amp; elem.nodeType != 1);
        return elem;
    }
    var thisDiv; var nextDiv; var selDiv;
    var containerDivList = document.getElementsByClassName("container");
    var containerArray = Array.prototype.slice.call(containerDivList);
    var container1 = containerArray[0];
    var container2 = containerArray[1];
    var container3 = containerArray[2];
    var container4 = containerArray[3];
    container1.onmouseover = function () {
        callPop(this.getElementsByTagName('div')[0]);
    }
    container1.onmouseout = function () {
        callDrop(this.getElementsByTagName('div')[0]);
    }
    container2.onmouseover = function () {
        callPop(this.getElementsByTagName('div')[0]);
    }
    container2.onmouseout = function () {
        callDrop(this.getElementsByTagName('div')[0]);
    }
    container3.onmouseover = function () {
        callPop(this.getElementsByTagName('div')[0]);
    }
    container3.onmouseout = function () {
        callDrop(this.getElementsByTagName('div')[0]);
    }


    var relativeHeights = ['0px', '5px', '10px', '15px', '20px', '25px', '30px', '35px', '40px', '45px', '50px'];
    var index = 10;
    var intervalHandle1;
    function callPop(thisDiv) {
        clearInterval(intervalHandle1);
        selDiv = thisDiv;
        intervalHandle1 = setInterval(popImage, 5);
    }
    function callDrop(thisDiv) {
        clearInterval(intervalHandle1);
        selDiv = thisDiv;
        intervalHandle1 = setInterval(dropImage, 5);
    }
    function popImage() {
        selDiv.style.top = relativeHeights[index];
        index--;
        if (selDiv.style.top === '0px') {
            index = 0;
        }
    }
    function dropImage() {
        index  ;
        selDiv.style.top = relativeHeights[index];
        if (selDiv.style.top === '50px') {
            index = 10;
        }
    }
  

Комментарии:

1. Имеет ли весь этот код отношение к вашему вопросу? Это довольно много.

2. Может быть, использовать jsfiddle.net , чтобы было проще помогать вам.

Ответ №1:

Вот пример использования jQuery, вы действительно должны использовать фреймворк для подобных вещей. Они упрощают все.

http://jsfiddle.net/AEJY9/

 $(function () {

$('.bouncer').hover(
  function () {
    $(this).stop().animate({
      top: 10
      }, 500);
  },
  function () {
    $(this).stop().animate({
      top: 50
      }, 500);
  }
);


});
  

Комментарии:

1. Спасибо, stuR, это работает действительно хорошо. Я действительно хотел знать, как это сделать без использования фреймворка, но, думаю, я могу просто исследовать методы jQuery в свободное время.