no category list @ hatena blog

  • /*
     * @title no category list @ hatena blog
     * @description カテゴリがない記事一覧 question:1499310079
     * @include http://blog.hatena.ne.jp/ * /archive
     * @license MIT http://opensource.org/licenses/MIT
     * @javascript_url
     */
    /*
        http://q.hatena.ne.jp/1499310079
    */
    (function() {
        const forEach = Array.prototype.forEach;
        const d_ = document;
    
        function display(url) {
            let title = d_.getElementById("title");
            let e = title.querySelector(".message");
            if (! e) {
                e = title.appendChild(d_.createElement("span"));
                e.className = "message";
                e.style.marginLeft = "2em";
            }
            let m = /page=(\d+)/.exec(url);
            if (m) {
                e.innerHTML = "(" + m[1] + ")";
            }
        }
    
        function hide_has_category(doc) {
            forEach.call(doc.querySelectorAll("#main-inner > .archive-entries > section.archive-entry a.archive-category-link"), function(category_link) {
                category_link.parentNode.parentNode.style.display = "none";
            });
        }
    
        function get_next_page_url(doc) {
            let url;
            let pager_next = doc.querySelector('.pager-next > a[rel="next"]');
            if (pager_next) {
                url = pager_next.href;
            }
            return url;
        }
    
        let n = 0;  // びびりなので、一応 ガード
        function load_next(url) {
            var xhr = new XMLHttpRequest();
            xhr.open('GET', url, true);
            xhr.onload = function(ev) {
                console.log(ev.target.responseURL, n);
                display(ev.target.responseURL);
                let dest = d_.querySelector("#main-inner > .archive-entries");
                hide_has_category(ev.target.response);
                forEach.call(ev.target.response.querySelectorAll("#main-inner > .archive-entries > section.archive-entry"), function(entry) {
                    dest.appendChild(entry);
                });
                n += 1;
                let url = get_next_page_url(ev.target.response);
                if (url && n < 100) {
                    load_next(url);
                } else {
                    let e = d_.querySelector("#title .message");
                    if (e) {
                        e.parentNode.removeChild(e);
                    }
                }
            };
            xhr.responseType = 'document';
            xhr.send(null);
        }
    
        hide_has_category(d_);
        load_next(get_next_page_url(d_));
    
    })();
    
    
  • Permalink
    このページへの個別リンクです。
    RAW
    書かれたコードへの直接のリンクです。
    Packed
    文字列が圧縮された書かれたコードへのリンクです。
    Userscript
    Greasemonkey 等で利用する場合の .user.js へのリンクです。
    Loader
    @require やソースコードが長い場合に多段ロードする Loader コミのコードへのリンクです。
    Metadata
    コード中にコメントで @xxx と書かれたメタデータの JSON です。

History

  1. 2017/07/07 08:33:45 - 2017-07-07
  2. 2017/07/06 15:38:15 - 2017-07-06