处理多个setInterval调用

时间:2011-10-18 10:55:36

标签: javascript event-handling refactoring setinterval

我无法解决如何为一类div创建一个简单的pop-and-drop效果。由于此类中每个项目的onmouseover事件当前正在调用相同的函数,因此在div之间快速混合使得前一个div中途停留(如果您从div的底部开始和关闭鼠标,您将看到效果我正在努力制作)。

我目前的方法还要求我复制相当多的代码来从每个div的事件处理程序调用函数,所以如果有办法将它们包装成一个函数,我真的很想知道如何。我确信有一种简单而有效的方法可以做到这一切,似乎无法解决这个问题。

jsFiddle示例: http://jsfiddle.net/DvXDb/

这是我的代码(底部的脚本):


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




    function next(elem) {
        do {
            elem = elem.nextSibling;
        } while (elem && 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 个答案:

答案 0 :(得分:1)

这是一个使用jQuery的例子,你真的应该使用这样的东西的框架。它们简化了一切。

http://jsfiddle.net/AEJY9/

$(function () {

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


});