-
Notifications
You must be signed in to change notification settings - Fork 0
/
jquery.rememberscroll.js
123 lines (103 loc) · 3.13 KB
/
jquery.rememberscroll.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
(function($) {
// http://www.nczonline.net/blog/2007/11/30/the-throttle-function/
function debounce(method, params, scope) {
clearTimeout(method._tId);
method._tId = setTimeout(function(){
method.apply(scope, params);
}, 100);
}
function rememberScroll(elem, options) {
log("Plugin applied to ", elem);
var attr = elem.attr(options.identAttr),
key = 'remember_scroll_' + attr + options.param,
val = $.jStorage.get(key);
if (! attr) {
throw "Cannot remember scroll on element with no identifying attribute";
}
if (val) {
log("Scrolling to: ", val.scroll);
options.scrollFunction(elem, val.scroll, options);
options.afterScroll(elem, val.scroll, options);
}
function storeScroll(elem) {
log("Storing scroll for ", key);
$.jStorage.set(key, { time: time(), scroll: elem.scrollTop() });
}
elem.bind('scroll.rememberScroll', function(e) {
debounce(storeScroll, [$(e.target)]);
});
}
function clear() {
var keys = $.jStorage.index();
for (var i = keys.length; i--;) {
if (keys[i].substr(0, 16) == 'remember_scroll_') {
$.jStorage.deleteKey(keys[i]);
log("Cleaned ", keys[i]);
}
}
}
function detach(elems) {
elems.each(function() {
$(this).unbind('scroll.rememberScroll');
});
}
function gc(options) {
if (shouldRunGC(options.gcProbability)) {
setTimeout(function() {
runGC(options.gcAfter * 1000);
}, 0);
}
}
function shouldRunGC(probability) {
var shouldRun = parseInt(Math.round(Math.random() * 10, 10)) < parseInt(probability * 10, 10);
if (shouldRun) {
log("Running GC");
return true;
}
return false;
}
function runGC(cleanAfter) {
var keys = $.jStorage.index();
for (var i = keys.length; i--;) {
if (keys[i].substr(0, 16) == 'remember_scroll_') {
var v = $.jStorage.get(keys[i]);
if ((+v.time + cleanAfter) < time()) {
$.jStorage.deleteKey(keys[i]);
log("Cleaned ", keys[i]);
}
}
}
}
function time() {
return +(new Date());
}
function log() {}
function setupLog(shouldLog) {
if (shouldLog && console && console.log) {
log = function() {
console.log.apply(console, ["[rememberScroll] "].concat(Array.prototype.slice.call(arguments)));
};
}
}
$.fn.rememberScroll = function(options) {
options = $.extend({}, $.fn.rememberScroll.defaults, options);
setupLog(options.debug);
log("Plugin initialized with options: ", options);
gc(options);
detach($(this));
$(this).each(function() { rememberScroll($(this), options); });
};
$.fn.rememberScroll.defaults = {
debug: false,
param: '',
identAttr: 'id',
gcProbability: 0.1, // between 0 and 1
gcAfter: 60 * 60 * 24 * 7, // one week
afterScroll: function(elem, distance, options) {},
scrollFunction: function(elem, distance, options) {
elem.scrollTop(distance);
}
};
$.fn.rememberScroll.clear = clear;
$.fn.rememberScroll.detach = detach;
})(jQuery);