Yet Another 勝手にスター
by
a-kuma3
2017-02-21 [2017/02/21 19:36:31]
クリックしたところに、勝手に はてなスターを置きます(一回だけ)
-
/*
* @title Yet Another 勝手にスター
* @description クリックしたところに、勝手に はてなスターを置きます(一回だけ)
* @include http://*
* @include https://*
* @license MIT License
* @javascript_url
*/
// inspired by
// http://let.hatelabo.jp/noromanba/let/hLHWyeejvP4c
// http://let.hatelabo.jp/pacochi/let/hLHWyNLcvcJD
(() => {
const d_ = document;
function put_star_container(e) {
if (! d_.querySelector('script[src*="s.hatena.ne.jp"]')) {
d_.head.appendChild(Object.assign(d_.createElement("script"), {
type: "text/javascript",
src: "//s.hatena.ne.jp/js/HatenaStar.js",
onload: () => put_star_container(e),
}));
return;
}
function insert_entry_node_next(e) {
return e.parentNode.insertBefore(d_.createElement("span"), e.nextSibling);
}
let p = {
node: e,
uri: d_.location.href,
title: d_.title,
};
let link = e.tagName == "A" && e.href ? e : e.querySelector("a[href]");
if (link) {
p.uri = link.href;
p.title = link.textContent.trim();
p.node = insert_entry_node_next(link);
/*
TODO: invisible a
e.g.
<div>
<div>visible</div> click !
<div style="display: none;">
invisible
<a href="...">...
</div>
*/
}
// img にも appendChild できちゃうんだねえ
if (e.tagName == "IMG") {
p.node = insert_entry_node_next(e);
}
// hr にも appendChild できちゃうけど、childNode は見える
// 他にも駄目なタグありそう
console.log(p);
let c = Hatena.Star.EntryLoader;
c.loadEntries = function(p) {
return [ new Hatena.Star.Entry({
entryNode: p.node,
uri: p.uri,
title: p.title,
comment_container: p.node.appendChild(c.createCommentContainer()),
star_container: p.node.appendChild(c.createStarContainer()),
}) ];
};
c.loadNewEntries(p);
delete c.loadEntries;
}
function once_handler(e) {
e.stopPropagation();
e.preventDefault();
put_star_container(e.target);
d_.removeEventListener('click', once_handler);
d_.removeEventListener('touchstart', once_handler);
/*
http://h.hatena.ne.jp/unarist/228182015329663515
https://developer.mozilla.org/ja/docs/Web/API/EventTarget/addEventListener#Parameters
addEventListener(..., ..., { once: true })
click と touchstart が一回ずつ使えちゃうか
*/
}
d_.addEventListener('click', once_handler);
d_.addEventListener('touchstart', once_handler);
})();
-
- Permalink
- このページへの個別リンクです。
- RAW
- 書かれたコードへの直接のリンクです。
- Packed
- 文字列が圧縮された書かれたコードへのリンクです。
- Userscript
- Greasemonkey 等で利用する場合の .user.js へのリンクです。
- Loader
- @require やソースコードが長い場合に多段ロードする Loader コミのコードへのリンクです。
- Metadata
- コード中にコメントで @xxx と書かれたメタデータの JSON です。