Показать сообщение отдельно
  #1 (permalink)  
Старый 05.08.2013, 10:18
Аватар для Viral
Профессор
Отправить личное сообщение для Viral Посмотреть профиль Найти все сообщения от Viral
 
Регистрация: 26.04.2011
Сообщений: 472

setInterval... туда и обратно...
Здравствуйте!
Долго и упорно упорото использовал jQuery и тут вдруг где-то замкнуло и захотелось перейти на чистый JS.
Это наверное от того, что курить бросил

Вместо .animate() пробую использовать setInterval и столкнулся с небольшой проблемой...
Скроллю документ посредством setInterval и scrollBy(y,x) при клике по меню навигации.
Однако если до того, как setInterval отработал кликнуть по другой кнопке, т.е. запустить ту же функцию, но с несколько другими данными, на экране происходит полнейшая бредятина.

Подскажите, пожалуйста, как необходимо доработать скрипт:


function iTryScroll(ID){
var anchor = document.getElementById('anchor-'+ID+'');
var spx = document.body.scrollTop;
var fpx = getOffset(anchor); //тут отдельная функция возвращает позицию элемента относительно начала документа
clearInterval(scroll);//я вроде и сбрасываю setInterval - а все равно какая-то лажа получается
  if(spx < fpx){//если мы сейчас выше якоря
    var scroll = setInterval(
      function(){
        if ((spx + 20) <= fpx ){
          window.scrollBy(0,20);
          spx = spx + 20;
        }else if((fpx - spx) != 0){
          window.scrollBy(0,(fpx - spx));
          spx = spx + (fpx - spx);
        }else{
          clearInterval(scroll);//останавливаем скроллинг при достижении цели
        }
      }
    ,1);
  }
  if(spx > fpx){// если мы сейчас ниже якоря
    var scroll = setInterval(
      function(){
        if ((spx - 20) >= fpx ){
          window.scrollBy(0,-20);
          spx = spx - 20;
        }else if((spx - fpx) != 0){
          window.scrollBy(0,-(spx - fpx));
          spx = spx + (fpx - spx);
        }else{
          clearInterval(scroll);//останавливаем скроллинг при достижении цели
        }
      }
    ,1);            
  }
}

Последний раз редактировалось Viral, 05.08.2013 в 10:20.
Ответить с цитированием