Hatena::Groupos0x

FFFF RSSフィード

0xFFのメモです。

2008 February 14th Thursday

AutoPagerizeしてるときにTwitterの返信ボタンをクリックするとタブが開いてしまうのを止める

| 21:15 | AutoPagerizeしてるときにTwitterの返信ボタンをクリックするとタブが開いてしまうのを止める - FFFF を含むブックマーク はてなブックマーク - AutoPagerizeしてるときにTwitterの返信ボタンをクリックするとタブが開いてしまうのを止める - FFFF

AutoPagerize0.0.23 - SWDYHですでに解決しています。

http://ss-o.net/userjs/blockblank.user.js

// ==UserScript==
// @name           block blank
// @namespace      http://ss-o.net/
// @include        http://twitter.com/home
// ==/UserScript==
setTimeout(function(){
	var xpath = './/img[contains(@src,"reply.png")]/..'; //  '//a';
	var target = '_self';
	var filter = function(docs) {
		if (!docs.length) return;
		for (var d=0;d<docs.length;d++) {
			var context = docs[d] || document;
			var doc = context.ownerDocument || context;
			var exp = doc.createExpression(xpath, function(){return "";});
			var res = exp.evaluate(context,XPathResult.ORDERED_NODE_SNAPSHOT_TYPE,null);
			for (var i =0,len=res.snapshotLength;i<len;i++){
				res.snapshotItem(i).target = target;
			}
		}
	}
	if (window.AutoPagerize && window.AutoPagerize.addFilter) {
		window.AutoPagerize.addFilter(filter);
	} 
},0);

Opera9とGreasemonkeyで動作確認。XPathを//aにすればすべてのリンクの_blankをブロックできる。

XPathを$X関数を使わずに書いてみる試み。

結局カンニングしちゃった。。

もっとシンプルに書けそうだな。

GreaseKitのソースをチェックアウトして眺めてみた

| 16:17 | GreaseKitのソースをチェックアウトして眺めてみた - FFFF を含むブックマーク はてなブックマーク - GreaseKitのソースをチェックアウトして眺めてみた - FFFF

Greasemonkeyのソースがかなりアレな件 - hogehoge @teramako

ユーザスクリプト内で(function(){ ... })()とわざわざクロージャを作る必要は無い

に反応。

上記はGreasemonkeyの話。

Operaではfunctionでラップしないとグローバルに変数を作ってしまう。

さらにOperaの場合、user.jsという拡張子にするとwindow#loadイベントで実行される。

.jsだとページ内のどのScriptよりも先に実行される(よって、ページのDOMの作成完了前に実行される。Greasemonkeyと揃えるなら自前でDOMContentLoadedにイベントをセットする必要がある)

詳しくは http://jp.opera.com/support/tutorials/userjs/using/


で、GreaseKitはどうだったか少し調べてみようということで、

http://code.google.com/p/greasekit/

からソースをCheckoutしてみたんだけど、、、

えーと、これはObjective-Cってやつですかね。それすら自信がない。。

ただ、

http://greasekit.googlecode.com/svn/trunk/template.js

このファイルがテンプレートになっていたり、

http://greasekit.googlecode.com/svn/trunk/CMController.m

には、// eval on frame ってコメントがあるようにframeで実行されているみたいなのでGreasemonkeyと同じくfunctionでラップする必要はなさそうです。

実行タイミングはDOMContentLoaded相当だと思うんだけど、それを裏付けるソースがわからなかった。。

あ、ちなみにfunctionでラップされているってことは、いきなりreturnしてもokってことですね。

作者のkzysさんから「DOMContentLoaded 相当」とのコメントをいただきました。実装としては、jQueryなどで実現されている方法と同じようです。これは厳密なDOMContentLoadedではないので、GreaseKitスクリプトからwindowのonloadイベントを触るのは確実性に欠けるようです(oAutoPagerizeで触った実感としても)。個人的には、GreaseKitがOperaのUserJavaScript互換になったら嬉しいかなと思う。(window.GreaseKitとかも)

kzyskzys2008/02/15 15:43言語は Objective-C で、実行時は DOMContentLoaded 相当です。
実装では document.readyState == 'loaded' かどうかをチェックしています。

os0xos0x2008/02/15 16:08> kzysさん
あざっす!
「DOMContentLoaded 相当」であって、そのものではないということですね。
jQueryとかで使われているのと仕組みとしては同じ実装ですね。