Adds keyboard shortcuts for navigating forum pages on teamfortress.tv
目前為
// ==UserScript==
// @name tftv keyboard shortcuts
// @namespace Lense
// @description Adds keyboard shortcuts for navigating forum pages on teamfortress.tv
// @include /^https?://(www\.)?teamfortress.tv/.*/
// @version 0.3
// @grant none
// ==/UserScript==
/*
* Helper function to scroll to post by id
*/
function goto_post(id) {
document.getElementById(id).scrollIntoView();
window.scrollBy(0,-40)
}
/*
* Find the number of pages in the thread
*/
var lastPage = 1;
var nodeList = document.querySelectorAll(".page-btn");
for(var i=0; i<nodeList.length; i++) {
if(parseInt(nodeList[i].textContent) > lastPage) {
lastPage = parseInt(nodeList[i].textContent);
}
}
/*
* Find the post number of the top post on the page
*/
var posts = document.querySelectorAll(".post");
var cur_post = 0;
/*
* Get and process keypresses
*/
document.onkeypress = function (e) {
// Not entirely sure why this is useful, but it can't break anything that isn't already broken
e = e || window.event;
// Ignore keypresses in text boxes
if(e.target.nodeName != "BODY") {
// got keypress, but it's probably in a textbox, so ignore it
return;
}
// Current page number
var page = window.location.search == "" || parseInt(window.location.search.match("page=([0-9]*)")[1]);
// and yes, I am proud of the logic in that statement.
switch(e["key"]) {
/*
* Pages (left/right)
*/
case "d":
if(page != lastPage) {
page = (page+1).toString();
window.location.search = "?page=" + page;
}
break;
case "a":
if(page != 1) {
page = (page-1).toString();
window.location.search = "?page=" + page;
}
break;
case "D":
if(page != lastPage) {
window.location.search = "?page=" + lastPage.toString();
}
break;
case "A":
if(page != 1) {
window.location.search = "?page=1";
}
break;
/*
* Posts (up/down)
*/
case "w":
if(cur_post > 0) {
cur_post--;
}
goto_post(posts[cur_post].id);
break;
case "s":
if(cur_post < posts.length - 1) {
cur_post++;
}
goto_post(posts[cur_post].id);
break;
case "W":
cur_post = 0;
goto_post(posts[cur_post].id);
break;
case "S":
cur_post = posts.length - 1;
goto_post(posts[cur_post].id);
break;
/*
* Frags (+/-)
*/
case "q":
$.ajax({
type: 'post',
data: {},
url: '/post/frag/' + posts[cur_post].id.slice(8) + '/plus',
});
break;
case "e":
$.ajax({
type: 'post',
data: {},
url: '/post/frag/' + posts[cur_post].id.slice(8) + '/minus',
});
break;
}};