Yet Another 勝手にスター
by
a-kuma3
2017-02-21 [2017/02/21 19:36:31]
クリックしたところに、勝手に はてなスターを置きます(一回だけ)
@@ -6,71 +6,93 @@
* @license MIT License
* @javascript_url
*/
-// inspired by
-// http://let.hatelabo.jp/noromanba/let/hLHWyeejvP4c
-// http://let.hatelabo.jp/pacochi/let/hLHWyNLcvcJD
+// inspired by
+// http://let.hatelabo.jp/noromanba/let/hLHWyeejvP4c
+// http://let.hatelabo.jp/pacochi/let/hLHWyNLcvcJD
(() => {
- const d_ = document
+ 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
- }
-
- let uri = d_.location.href,
- title = d_.title
-
- let link = e.tagName == "A" && e.href ? e : e.querySelector("a[href]")
- if (link) {
- uri = link.href
- title = link.textContent.trim()
- e = link.parentNode.insertBefore(d_.createElement("span"), link.nextSibling)
- }
-
- // img にも appendChild できちゃうんだねえ
- if (e.tagName == "IMG") {
- e = e.parentNode.insertBefore(d_.createElement("span"), e.nextSibling)
- }
-
- // hr にも appendChild できちゃうんだが、childNode は見える
- // 他にも駄目なタグありそう
-
- let c = Hatena.Star.EntryLoader
- const entry = new Hatena.Star.Entry({
- entryNode: e,
- uri: uri,
- title: title,
- comment_container: e.appendChild(c.createCommentContainer()),
- star_container: e.appendChild(c.createStarContainer()),
- });
- entry.showButtons();
-
- if (c.entries) {
- c.entries.push(entry)
- } else {
- c.entries = [ entry ]
- }
-
- new Ten.JSONP('//s.hatena.ne.jp/entries.json?uri=' + uri, c, 'receiveStarEntries');
-
- }
-
- function one_time_handler(e) {
- e.stopPropagation();
- e.preventDefault();
-
- put_star_container(e.target);
-
- d_.removeEventListener('click', one_time_handler);
- d_.removeEventListener('touchstart', one_time_handler);
- }
- d_.addEventListener('click', one_time_handler);
- d_.addEventListener('touchstart', one_time_handler);
+ 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);
-})()
+})();
/*
* @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 です。