2013-09-15 3 views
2

У меня есть следующий код, который изменяет класс div при прокрутке вниз. Проблема в том, что если вы прокручиваете очень быстро (или, если я помещаю ссылки на div в моем меню), функция тайм-аута не выполняет только последнее условие, а все они как последовательность. Я хочу сделать это, если условие изменяется, когда функция находится в пределах таймаута, чтобы пропустить функцию и проверить следующее условие.Не выполняйте setTimeout, если изменения условий

$(document).scroll(function() {  
    var about = jQuery('#hh1').position().top; 
    var portfolio = jQuery('#hh2').position().top; 
    var services = jQuery('#hh3').position().top; 
    var workingprocess = jQuery('#hh4').position().top; 
    var clients = jQuery('#hh5').position().top; 
    var blog = jQuery('#hh6').position().top; 
    var contact = jQuery('#hh7').position().top; 
    var scroll = $(this).scrollTop(); 
    if (scroll >= hh1-90 && scroll < hh3-90 || scroll >= hh5-90 && scroll < hh6-90) 
    {setTimeout('$(".div").addClass("MyClass")',3440);} 
    else 
    { 
    setTimeout('$(".div").removeClass("MyClass")',3440); 
    } 
    }); 
+0

Помимо других проблем, я боюсь, в том, что ваш обработчик события прокрутки установки нескольких тайм-аута и их не клирингового. Это замедлит ваш скрипт LOT. Вы должны очистить свой тайм-аут, когда это не нужно. – Starx

+0

Какие еще проблемы? Пожалуйста, скажите мне? Я хотел бы исправить их – Ivan

+1

Для справки: '$ ('. Div'). ToggleClass ('MyClass', shouldHaveClass),' избавится от необходимости if/else. Просто возьмите условие, которое вы в настоящее время используете для 'if', и назначаете его переменной с именем' shouldHaveClass'. – cHao

ответ

3

setTimeout(...) метод принимает функцию для выполнения, когда происходит тайм-аут. Вы не отправляете ему функцию.

setTimeout('$(".div").addClass("MyClass")',3440); 

Изменить это

setTimeout(function(){$(".div").addClass("MyClass")},3440); 

, а затем -

Вы должны хранить численный таймаут идентификатор, возвращаемый методом setTimeout(...) и использовать его, чтобы очистить таймаут clearTimeout(...).

Сохранить таймаут идентификатор как

timeoutID = setTimeout(function(){$(".div").addClass("MyClass")},3440); 

, а затем использовать его, чтобы очистить таймер.

clearTimeout(timeoutID); 

Вам не нужно проверить, если тайм-аут произошел или нет, потому что если произошел таймаут, то функция, заданная бы вызывались, и если это не так, вам нужно, чтобы очистить его. Итак, просто очистите таймаут, когда условие изменится.

+0

Передача строки работает, по соображениям совместимости, я представляю (первые версии JS взяли строку, потому что они не поддерживали анонимные функции очень хорошо, если вообще), но это отвратительно. – cHao

+0

Я не понимаю, где я должен поместить clearTimeout: [ – Ivan

+0

, если я помещаю внутри него, он не работает – Ivan

0

Попробуйте это:

var addClass = function() { 
    $(".div").addClass("MyClass"); 
} 

var removeClass = function() { 
    $(".div").removeClass("MyClass"); 
} 

if (scroll >= hh1-90 && scroll < hh3-90 || scroll >= hh5-90 && scroll < hh6-90) 
    { 
     setTimeout(myClass,3440); 
    } 
    else 
    { 
     setTimeout(removeClass,3440); 
    } 
+0

Зачем вам переопределять метод addClass? –

+0

Что вы имеете в виду? – user1956570

Смежные вопросы