Ответ 1
Один из способов, который вы можете использовать, - установить таймер в событии прокрутки и выполнять основную работу, когда положение прокрутки не изменилось в течение короткого периода времени. Я использую этот метод для событий изменения размера, которые имеют одинаковую проблему. Вы можете поэкспериментировать с тем, какое значение тайм-аута кажется правильным. Более короткое время обновляется с более короткими паузами в прокрутке и, следовательно, может работать чаще во время прокрутки, более длительное время требует, чтобы пользователь фактически приостановил все движения за значимое время. Вам нужно будет поэкспериментировать с тем, какое значение тайм-аута лучше всего подходит для ваших целей, и было бы лучше протестировать на относительно медленном компьютере, так как проблема с задержкой прокрутки была бы наиболее выраженной.
Вот общая идея, как это можно реализовать:
var scrollTimer = null;
$(window).scroll(function () {
if (scrollTimer) {
clearTimeout(scrollTimer); // clear any previous pending timer
}
scrollTimer = setTimeout(handleScroll, 500); // set new timer
});
function handleScroll() {
scrollTimer = null;
var headerBottom = 165;
var fcHeight = $("#pnlMainNavContainer").height();
var ScrollTop = $(window).scrollTop();
if (ScrollTop > headerBottom) {
$("#HeaderContentBuffer").attr("style", "margin-top:" + (fcHeight) + "px;");
$("#AddFieldsContainer").attr("style", "position:fixed;width:320px;top:70px;left:41px;");
} else {
$("#HeaderContentBuffer").attr("style", "margin-top: 0px;");
$("#AddFieldsContainer").removeAttr("style");
}
}
Вы также можете ускорить свою функцию прокрутки, кешируя некоторые из селекторов при первом прокрутке, поэтому их не нужно пересчитывать каждый раз. Это одно место, где дополнительные накладные расходы на создание объекта jQuery каждый раз могут не помочь вам.
Здесь используется метод добавления jQuery, который обрабатывает для вас таймер прокрутки:
(function($) {
var uniqueCntr = 0;
$.fn.scrolled = function (waitTime, fn) {
if (typeof waitTime === "function") {
fn = waitTime;
waitTime = 500;
}
var tag = "scrollTimer" + uniqueCntr++;
this.scroll(function () {
var self = $(this);
var timer = self.data(tag);
if (timer) {
clearTimeout(timer);
}
timer = setTimeout(function () {
self.removeData(tag);
fn.call(self[0]);
}, waitTime);
self.data(tag, timer);
});
}
})(jQuery);
Рабочая демонстрация: http://jsfiddle.net/jfriend00/KHeZY/
Затем ваш код будет реализован следующим образом:
$(window).scrolled(function() {
var headerBottom = 165;
var fcHeight = $("#pnlMainNavContainer").height();
var ScrollTop = $(window).scrollTop();
if (ScrollTop > headerBottom) {
$("#HeaderContentBuffer").attr("style", "margin-top:" + (fcHeight) + "px;");
$("#AddFieldsContainer").attr("style", "position:fixed;width:320px;top:70px;left:41px;");
} else {
$("#HeaderContentBuffer").attr("style", "margin-top: 0px;");
$("#AddFieldsContainer").removeAttr("style");
}
});