11
\$\begingroup\$

I've written a small script to enable the vote count viewing functionality that comes for users at 1k reputation:

// ==UserScript==
// @name Vote count viewer
// @namespace https://github.com/The-Quill/VoteCountViewer
// @version 1.0
// @description Lets you view the vote count on posts.
// @author Quill
// @match *://meta.stackexchange.com/questions/*
// @match *://*.stackexchange.com/questions/*
// @match *://meta.*.stackexchange.com/questions/*
// @match *://stackoverflow.com/questions/*
// @match *://meta.stackoverflow.com/questions/*
// @match *://serverfault.com/questions/*
// @match *://meta.serverfault.com/questions/*
// @match *://superuser.com/questions/*
// @match *://meta.superuser.com/questions/*
// @match *://askubuntu.com/questions/*
// @match *://meta.askubuntu.com/questions/*
// ==/UserScript==
(function() {
 Array.prototype.slice.call(document.getElementsByClassName('vote-count-post')).forEach(function(post) {
 post.addEventListener("click", getScore);
 });
 function getScore() {
 var post = this;
 var postId = post.parentElement.children[0].value;
 var site = document.location.hostname;
 var url = "//api.stackexchange.com/2.2/posts/" + postId + "?site=" + site + "&key=fetJx5PJVUspEFsbpN9n1A((&filter=!.UE7HKkP*tRsqwc8";
 var ups = 0;
 var downs = 0;
 $.getJSON(url, function(e) {
 ups = parseInt(e.items[0].up_vote_count, 10);
 downs = parseInt(e.items[0].down_vote_count, 10);
 }).done(function() {
 post.title = ups + " up / " + downs + " down";
 post.innerHTML = "";
 var green = document.createElement('div');
 green.style.color = "green";
 green.textContent = ups;
 var separator = document.createElement('div');
 separator.classList.add('vote-count-separator');
 var maroon = document.createElement('div');
 maroon.color = "maroon";
 maroon.textContent = downs;
 post.appendChild(green);
 post.appendChild(separator);
 post.appendChild(maroon);
 });
 };
})();
asked Dec 16, 2015 at 9:44
\$\endgroup\$
2
  • 1
    \$\begingroup\$ I'm confused. Does this UserScript add the functionality for users who don't already have it? \$\endgroup\$ Commented Dec 17, 2015 at 0:08
  • \$\begingroup\$ Yes @SirPython, it does. \$\endgroup\$ Commented Dec 17, 2015 at 0:09

1 Answer 1

6
\$\begingroup\$

You'd probably be better off renaming your var green and var maroon to something like var upElement and var downElement. The reason being if you later decide to use different colors you wouldn't need to change the variable name to match the new colors.

Instead of parseInt you can use + i.e ups = +e.items[0].up_vote_count;

If you're concerned about performance, you could create a documentFragment to which you would append your green, separator, maroon elements, before appending the fragment to post.

If you don't need to support IE you could use fetch instead of relying on jQuery's getJSON, :

var getCounts = function (e) {
 return {
 ups : parseInt(e.items[0].up_vote_count, 10),
 downs = parseInt(e.items[0].down_vote_count, 10)
 }
}
var showCounts = function (counts) {
 var ups = counts.ups;
 var downs = counts.downs;
 // etc;
}
fetch(url).then(getCounts).then(showCounts)
Quill
12k5 gold badges41 silver badges93 bronze badges
answered Dec 16, 2015 at 10:26
\$\endgroup\$
3
  • \$\begingroup\$ I disagree with using + instead of parseInt; that is very "hacky" and should only be reserved for golfing. \$\endgroup\$ Commented Dec 18, 2015 at 2:09
  • \$\begingroup\$ @SirPython - + behaves differently to parseInt - stackoverflow.com/questions/17106681/… . \$\endgroup\$ Commented Dec 30, 2015 at 18:42
  • \$\begingroup\$ That's a very interesting post; thanks for sharing! However, I still believe it's a bit hacky. Perhaps Number() could be used instead, as they will both generate the same value? \$\endgroup\$ Commented Dec 31, 2015 at 1:12

Your Answer

Draft saved
Draft discarded

Sign up or log in

Sign up using Google
Sign up using Email and Password

Post as a guest

Required, but never shown

Post as a guest

Required, but never shown

By clicking "Post Your Answer", you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.