2008-02-21
■ [javascript][haiku] はてなハイクで選択したキーワードやユーザだけ表示する 
この前の改良版。コードを整理して次ページ読み込み時に絞り込みを反映するようにした。
- キーワードやユーザアイコンをクリックするとページ遷移せずに、そのキーワードやユーザのエントリだけの表示に絞り込みます。
- 同じキーワードやユーザアイコンをもう一度クリックすると、実際にそのキーワードやユーザのページに行きます。
- リンクじゃないところをクリックで絞り込みを解除します。
// ==UserScript== // @name Entry selector // @namespace http://h.hatena.ne.jp/TransFreeBSD/ // @include http://h.hatena.ne.jp/* // ==/UserScript== (function(){ function entry_selector(e) { var context = ""; var word = document.evaluate("//div[@class='input']//input[@name='word']", document,null,XPathResult.FIRST_ORDERED_NODE_TYPE,null).singleNodeValue; var className = e.target.parentNode.parentNode.className; if (className == "list-image") { context = "//img[@class='profile-image']/..[not(@href='"+e.target.parentNode.pathname+"')]/../..[@class='entry'][not(div[@class='list-body']/div[@class='input'])]"; word.value = "id:"+e.target.title; } else if (className == "list-keyword" || className == "list-body") { context = "//a[not(@href='"+e.target.pathname+"')]/..[@class='title']/../..[@class='entry']"; word.value = e.target.textContent; } if (entry_selector.context != context) { if (context) { if (e.cancelable) e.preventDefault(); } else { if (document.defaultView.getComputedStyle(e.target, null).getPropertyValue("cursor") == "pointer") return; if (e.target.form) return; } if (entry_selector.context) { var entry = document.evaluate("//div[@class='entry']", document,null,XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE,null); for (var i=0; i<entry.snapshotLength; i++) { entry.snapshotItem(i).style.display = "block"; } } entry_selector.context = context; } if (!entry_selector.context) return; var entry = document.evaluate(entry_selector.context, document,null,XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE,null); for (var i=0; i<entry.snapshotLength; i++) { entry.snapshotItem(i).style.display = "none"; } } unsafeWindow.Hatena.Haiku.Pager.addEventListener("loadedEntries", function(){ if (!entry_selector.context) return; var entry = document.evaluate(entry_selector.context, document,null,XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE,null); for (var i=0; i<entry.snapshotLength; i++) { entry.snapshotItem(i).style.display ="none"; } }, false); entry_selector.context = ""; document.getElementById("container").addEventListener("click", entry_selector, false); })();
コメントを書く
トラックバック - http://freebsd.g.hatena.ne.jp/TransFreeBSD/20080221