Google Reader で 5 件ずつ一気に新しいタブで表示する Greasemonkey を書いてみた その4

その3:http://d.hatena.ne.jp/spider-man/20080117#p3
タイトルを統一してるけど、5件と全件(といいつつ50件)を一気に開くボタンを追加します。
見た目が微妙だったので、Google Reader に合わせてみた。「すべて既読にする」ボタンを clone しただけなんだけどこのメソッド便利ね。

現在のノードの複製を返します。
[編集] 構文
dupNode = element.cloneNode(deep);
deep は必須の真偽値で、複製ノードが深い複製かどうかを示します

DOM:element.cloneNode

見た目はこんなの

マニュアルページを見てて気になったんだけど、

insertBefore( insertedNode, adjacentNode )
DOM 内で、第二引数のノードを第一引数のノード (子要素) の前に挿入します。

DOM:element

説明の第二と第一が逆だと思うんだよねぇ・・・おかげではまった orz

んで、ソース

// ==UserScript==
// @name           google reader all open button
// @namespace      googlereader@basyura.com
// @include        http://www.google.co.jp/reader/view/*
// ==/UserScript==
//
//  version 0.6 2008.01.19 <件数指定で表示できていなかったのを修正>
//  version 0.5 2008.01.19 <全て既読にするが無効になっていたのを修正>
//  version 0.4 <ボタン変更>
//
var MAX_OPEN_COUNT = 5;
function openAll() {
  openPages(50);
}
function openPages(max) {
  if(max != isNaN(max)) {
    max = MAX_OPEN_COUNT;
  }
  var entries = document.getElementById("entries");
  var hrefs   = entries.getElementsByTagName("a");
  var limit = hrefs.length - 2;
  if(limit > max) {
    limit = max;
  }
  for(var i = 0 ; i < limit ; i++) {
    var event = document.createEvent('MouseEvents');
    event.initMouseEvent ('click', false, true, document.defaultView,
        1, 0, 0, 0, 0, false, false, false, false, 0, null);

    hrefs[i].dispatchEvent(event);
    GM_openInTab(hrefs[i].href);
  }
  for(var i = 0 ; i < limit ; i++) {
    var list = hrefs[i].parentNode.parentNode.parentNode.parentNode;
    list.removeChild(list.firstChild);
  }
}
function addButton() {
  try {
    var toplinks = document.getElementById("viewer-top-links");
    var allread  = document.getElementById("mark-all-as-read");

    var nopen = allread.cloneNode(true);
    nopen.id  = "nopen";
    toplinks.insertBefore(nopen , allread);

    var n_span = nopen.getElementsByTagName("span")[0];
    n_span.innerHTML = MAX_OPEN_COUNT + "件表示";
    n_span.addEventListener("click" , openPages , false);

    var all = allread.cloneNode(true);
    all.id  = "allopen"
      toplinks.insertBefore(all , allread);

    var all_span = all.getElementsByTagName("span")[0];
    all_span.innerHTML = "すべて表示";
    all_span.addEventListener("click" , openAll , false);

  } catch(e) {
    alert(e.message);
  }
}
addButton();

ちなみにファイルは utf-8 で保存しとかないと文字化け。

ここ(http://www3.pf-x.net/~spider-man/)にも置いておいた。

追記:全て既読にするが効かなくなってた・・・

cloneNode したノードの id を変えてなかったのが原因。ver5 でアップ(http://www3.pf-x.net/~spider-man/)し直した。↑のソースも修正

さらに追記:件数指定が効いてない・・・

addEventListener で関数指定した場合に第一引数って Event オブジェクトなのかな・・・調べてみよう。
↑のソースも修正