livedoor Readerをホイール操作ですいすい読むためのGreasemonkey


もともと#headerの部分でマウス操作ができるけど、コストの高い「クリック」に次の記事への移動が割り当てられているため、どんどん記事を流し読みしていくような使い方だと指が疲れる。今になってクリック→クリックしっぱなしで自動スクロールできることを知った。また、普段#header部分は非表示にしているため、そもそも使えない。
なので、#headerの下の部分(#menu、#control)でのホイール操作で、前後の記事へ移動するようにするGreasemonkeyスクリプトを作った。また、左クリックで元記事を開く、右クリックでgキーを押したことにする(LDR Full Feed用)ようにした。

// ==UserScript==
// @name        LDR_mouser
// @namespace   http://d.hatena.ne.jp/rikuba/
// @include     http://reader.livedoor.com/reader/*
// ==/UserScript==

(function(){
  var w = unsafeWindow;
  var _onload = w.onload;

  function dispatchKeyEvt(target, key) {
    var keyEvt = document.createEvent('KeyboardEvent');
    keyEvt.initKeyEvent('keydown', true, true, null, false, false, false, false, keyEvt[key], 0);
    (target || document).dispatchEvent(keyEvt);
  }

  var onload = function() { with(w) {
    function addEvents(nodes, events) {
      if (!nodes.hasOwnProperty('0') || typeof nodes.length !== 'number') nodes = [nodes];
      for (var i = 0, I = nodes.length, node; i < I; ++i) {
        node = nodes[i];
        for (var type in events) {
          if (!events.hasOwnProperty(type)) return;
          addEvent(node, type, events[type], false);
        }
      }
    }

    addEvents([$('menu'), $('control')], {
      DOMMouseScroll: function(evt) {
        if (evt.detail > 0) Control.go_next();
        else                Control.go_prev();
      },
      click: function(evt) {
        if (/A/i.test(evt.target.tagName)) return;
        Control.view_original();
      },
      contextmenu: function(evt) {
        if (/A/i.test(evt.target.tagName)) return;
        evt.preventDefault();
        dispatchKeyEvt(this, 'DOM_VK_G');
      }
    });
  }};

  w.onload = function(){
    _onload();
    onload();
  }
})();