Yet Another 勝手にスター

  • /*
     * @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