NOTICE: By continued use of this site you understand and agree to the binding Terms of Service and Privacy Policy.
// ==UserScript==
// @name VK Hotkeys
// @version 1.1.0
// @namespace https://github.com/trsrm/vk-scripts
// @author Taras Romaniv (https://github.com/trsrm)
// @description Hotkeys for http://vk.com website
// @homepageURL https://github.com/trsrm/vk-scripts
// @match *://vk.com/feed
// @run-at document-end
// @grant none
// ==/UserScript==
(function () {
'use strict';
var feed = {
activePost: void 0,
intervalScrollCheck: void 0,
setActivePost: function (post) {
post.style['box-shadow'] = '-15px 0 0 0 #fff, -16px 0 0 0 rgba(89, 125, 163, .66)';
this.activePost = post;
this.startScrollChecks();
},
unsetActivePost: function () {
this.activePost.style['box-shadow'] = 'none';
this.activePost = void 0;
this.stopScrollChecks();
},
startScrollChecks: function () {
var that = this;
this.intervalScrollCheck = setInterval(function () {
if (window.pageYOffset + 100 > that.activePost.offsetTop + that.activePost.offsetHeight ||
window.pageYOffset + window.innerHeight - 100 < that.activePost.offsetTop
) {
that.unsetActivePost();
}
}, 1000);
},
stopScrollChecks: function () {
clearInterval(this.intervalScrollCheck);
},
scrollToPost: function (post) {
this.unsetActivePost();
window.scrollTo(0, post.offsetTop);
this.setActivePost(post);
},
nextPost: function () {
if (!this.activePost) {
this.activePost = this.findVisiblePost();
}
if (Math.ceil(window.pageYOffset / 100) * 100 < this.activePost.offsetTop) {
this.scrollToPost(this.activePost);
} else {
var next = this.activePost.nextElementSibling;
if (next) {
this.scrollToPost(next);
}
}
},
prevPost: function () {
this.activePost = this.activePost || this.findVisiblePost();
var prev = this.activePost.previousElementSibling;
if (prev) {
this.scrollToPost(prev);
}
},
clearGarbage: function () {
var adsPlaceholder = document.querySelector('#ads_feed_placeholder');
if (adsPlaceholder) {
var adsParent = adsPlaceholder.parentNode;
adsParent.parentNode.removeChild(adsParent);
}
},
findVisiblePost: function () {
feed.clearGarbage();
var posts = document.querySelectorAll('#feed_rows > .feed_row');
for (var i = 0; i < posts.length; i++) {
if (window.pageYOffset < posts[i].offsetTop + posts[i].offsetHeight) {
return posts[i];
}
}
}
};
window.addEventListener('keypress', function (event) {
switch (event.keyCode) {
case 106:
case 1086:
feed.nextPost();
break;
case 107:
case 1083:
feed.prevPost();
break;
}
});
})();