Google Reader で 5 件ずつ一気に新しいタブで表示する Greasemonkey を書いてみた その4
その3:http://d.hatena.ne.jp/spider-man/20080117#p3
タイトルを統一してるけど、5件と全件(といいつつ50件)を一気に開くボタンを追加します。
見た目が微妙だったので、Google Reader に合わせてみた。「すべて既読にする」ボタンを clone しただけなんだけどこのメソッド便利ね。
現在のノードの複製を返します。
DOM:element.cloneNode
[編集] 構文
dupNode = element.cloneNode(deep);
deep は必須の真偽値で、複製ノードが深い複製かどうかを示します
見た目はこんなの
マニュアルページを見てて気になったんだけど、
insertBefore( insertedNode, adjacentNode )
DOM:element
DOM 内で、第二引数のノードを第一引数のノード (子要素) の前に挿入します。
説明の第二と第一が逆だと思うんだよねぇ・・・おかげではまった 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 オブジェクトなのかな・・・調べてみよう。
↑のソースも修正