2015-08-23 3 views
0

Я довольно новичок в JavaScript и обнаружил, что я немного застрял в одной, казалось бы, очень простой задаче с функцией onScroll.Невозможно получить функцию onScroll для запуска только один раз

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

Пожалуйста, помогите!

Большое уважение и большое спасибо!

$(window).scroll(function() { 
    $('#pro1').each(function() { 
    var topOfWindow = $(window).scrollTop(), 
    bottomOfWindow = topOfWindow + $(window).height(); 

    var imagePos = $(this).offset().top; 

    if(imagePos < bottomOfWindow-200 && imagePos >= topOfWindow-500){ 
     $(this).addClass('bigEntrance2'); 
    }else{ 
     $(this).removeClass('bigEntrance2'); 
    } 
    }); 
}); 
+0

Вы пробовали $ (window) .scrollTo вместо этого? – Guido

+0

Это работает на «щелчке» пользователя, я прав? Я не хочу, чтобы пользователь должен был щелкнуть, просто чтобы перейти к определенной точке на странице, чтобы функция срабатывала. – frank

ответ

0

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

var alreadyScrolled = false; 
$(window).scroll(function() { 
    if(!alreadyScrolled) { 
      $('#pro1').each(function() { 
       var topOfWindow = $(window).scrollTop(), 
       bottomOfWindow = topOfWindow + $(window).height(); 

       var imagePos = $(this).offset().top; 

       if(imagePos < bottomOfWindow-200 && imagePos >= topOfWindow-500){ 
        $(this).addClass('bigEntrance2'); 
       }else{ 
        $(this).removeClass('bigEntrance2'); 
       } 
      }); 
      alreadyScrolled = true; 
    } 
}); 
+0

Спасибо! Hmm..element не загружается вообще. FYI элемент кодируется как «видимость: скрытая»; в CSS, чтобы отображаться только через функцию. Возможно, это заставляет его не появляться? – frank

+0

Эта 'видимость: скрытая;' связана с каким селектором CSS? –

+0

С элементом, который я оживляю. Он скрыт до тех пор, пока не будет вызван этим скриптом. Теперь он работает либо с вашим методом, либо с Райаном выше, но только в том случае, если элемент находится в пределах просмотра страницы при обновлении веб-сайта. Не отображается вообще, если веб-сайт загружен, как обычно, с верхней части сайта. Weird! Есть идеи? – frank

1

Вы можете использовать метод one. Это то же самое, что и метод on, но срабатывает только один раз на загрузку страницы. Так что для вашего примера это будет выглядеть так:

$(window).one("scroll", function() 
{ 
    # Scroll code here 
}); 

Редактировать: Думаю, я лучше понимаю ваш вопрос. Вы хотите, чтобы код проверялся, когда вы находитесь в этой области прокрутки, но выполняете только один раз. Таким образом, чтобы сделать это, вы должны сначала назначить пользовательское событие:

$(window).one("customEvent", function() 
{ 
    $(this).addClass('bigEntrance2'); 
}); 

А потом вызвать это событие, когда вы хотите:

if(imagePos < bottomOfWindow-200 && imagePos >= topOfWindow-500) 
{ 
    $(this).trigger("customEvent"); 
} 

Таким образом, класс «bigEntrance2» применяется только один раз, что это то, что я думаю, вы хотите.

+0

Сегодня я кое-что узнал. Не знал этого. –

+0

Спасибо, Райан, этот, похоже, работает! Но еще одна проблема - у меня есть веб-сайт стиля прокрутки вниз (sting). Функция, которую он запускает, только если я загружаю страницу в эту конкретную позицию прокрутки и не срабатывает, если я загружаю страницу из верхней части строки страниц? – frank

+0

Теперь он работает с этим методом, но только если элемент находится в пределах просмотра страницы, когда веб-сайт обновляется. Не отображается вообще, если веб-сайт загружен, как обычно, с верхней части сайта. Weird! Есть идеи? – frank