Yet Another 勝手にスター

    @@ -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 です。

History

  1. 2017/02/21 19:36:31 - 2017-02-21
  2. 2017/02/20 14:10:07 - 2017-02-20
  3. 2017/02/20 14:08:30 - 2017-02-20
  4. 2017/02/18 23:20:21 - 2017-02-18