ページの最後でスクロールしようとしたら自動で閉じる

これで、

  • Google Readerからvキーで元ページを表示
  • スペースキーで読み進む
  • ページの最後まで表示したら閉じる

という一連の操作がスムーズにできる。

インストールする

(2006.10.14 Altキーのチェックを追加)

// ==UserScript==
// @name           CloseAtPageEnd
// @namespace      http://d.hatena.ne.jp/nozom/
// @include        *
// @description Add autoclosing at the end of page
// ==/UserScript==

// Released under the GPL license
//  http://www.gnu.org/copyleft/gpl.html

(function() {
    function get_remain() {
        var canvas = document[ document.compatMode == 'CSS1Compat' ? 'documentElement' : 'body'];
        // GM_log('scrollHeight = ' + canvas.scrollHeight);
        // GM_log('clientHeight = ' + canvas.clientHeight);
        // GM_log('scrollTop = ' + canvas.scrollTop);
        // GM_log('pageYOffset = ' + window.pageYOffset);
        var total = canvas.scrollHeight - canvas.clientHeight;
        return total - window.pageYOffset;
    }

    function close_window() {
        window.opener = window;
        var win = window.open(location.href, "_self");
        win.close();
    }

    function forward_page() {
        var remain = get_remain();
        // GM_log('remain = ' + remain);
        if (remain == 0) {
            if (confirm('Close?')) {
                close_window();
            }
        }
    }

    function GRT_key(event) {
        var element = event.target;
        var elementName = element.nodeName.toLowerCase();
        if ((elementName == "input") ||
            (elementName == "textarea")) {
            return true;
        }
        if (String.fromCharCode(event.which) == " " && !event.ctrlKey && !event.altKey) {
            forward_page();
            return false;
        }
        return true;
    }

    function GRT_wheel(event) {
        var delta = event.detail;
        if (delta > 0) {
            forward_page();
        }
    }

    if (window.parent == window.self) {
        document.addEventListener("keypress", GRT_key, false);
        // document.addEventListener("DOMMouseScroll", GRT_wheel, false);
    }
})();