scala-news-reader
rss/atom news reader in scala
git clone https://9o.is/git/scala-news-reader.git
jquery.keynav.js
(2055B)
1 $.fn.keynav = (function () {
2 //a couple of global things for the plugin
3 var nodes = $(), positions = [], recalculate_positions, params;
4 params = {
5 keynext: 40,
6 keyprev: 38,
7 keynextJ: 74,
8 keyprevK: 75
9 };
10 //we're watching keypresses globally as well.
11 $(document).keydown(function(e) {
12 var st, prev, next, desired, i;
13 if (!nodes.length) {return true;}
14 if (e.target && e.target.tagName == 'TEXTAREA' || e.target.tagName == 'INPUT') {
15 return true;
16 }
17 if(e.keyCode == params.keynext || e.keyCode == params.keynextJ || e.keyCode == params.keyprevK || e.keyCode == params.keyprev) {
18 st = $(window).scrollTop();
19 //we're checking if our positions are still correct. it may not be necessary all the time, but just to be safe
20 if(positions[positions.length-1].top !== $(positions[positions.length-1].obj).offset().top) {
21 recalculate_positions();
22 }
23
24 if(e.keyCode === params.keynext || e.keyCode === params.keynextJ) {
25 for(i = positions.length-1; i > -1; i--) {
26 if(positions[i].top > st + 1) {desired = i;}
27 }
28 } else if(e.keyCode === params.keyprev || e.keyCode === params.keyprevK) {
29 for(i = 0; i < positions.length; i++) {
30 if(positions[i].top < st - 1) {desired = i;}
31 }
32 }
33
34 if(positions[desired]) {
35 $('html,body').animate({scrollTop: positions[desired].top}, 1);
36 } else {
37 $('html,body').animate({scrollTop: (e.keyCode === params.keynext || e.keyCode === params.keynextJ) ?
38 ($('body').height() - $(window).height()) : 0}, 1);
39 }
40 }
41 });
42
43 recalculate_positions = function () {
44 //this recalculates the positions of nodes
45 var deduct = 0;
46 if($(window).width() > 979) { deduct = 50; }
47
48 positions = [];
49 nodes.each(function() {
50 positions.push({top: Math.floor($(this).offset().top - deduct),obj: this});
51 });
52 };
53
54 return function(newparams) {
55 //all we do in the actual plugin is we take the parameters and add the new nodes where we want to navigate.
56 params = $.extend(params,newparams || {});
57 nodes = nodes.add(this);
58 recalculate_positions();
59 };
60
61 })();