Hatena::Groupos0x

FFFF RSSフィード

0xFFのメモです。

2008 February 28th Thursday

Twitterの自動focusを強引に外すGreasemonkey Script

| 21:58 | Twitterの自動focusを強引に外すGreasemonkey Script - FFFF を含むブックマーク はてなブックマーク - Twitterの自動focusを強引に外すGreasemonkey Script - FFFF

snj14さんの発言見て、書いてみた。

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

// ==UserScript==
// @name           twitter stop focus
// @namespace      http://ss-o.net/
// @include        http://twitter.com/home*
// ==/UserScript==
(function(unsafeWindow){
	var onload = unsafeWindow.onload;
	unsafeWindow.onload = function(){
		var status = document.getElementById('status');
		var _id = status.id;
		status.setAttribute('id',_id + '_nofocus');
		var span = document.body.appendChild(document.createElement('span'));
		span = span.wrappedJSObject || span;
		span.id = _id;
		span.value = {'length':0};
		onload();
		document.body.removeChild(span);
		status.setAttribute('id',_id);
	}
})(this.unsafeWindow || window);

やってることは、テキストエリアのidを書き換え、ダミーを用意してエラーを回避、focusのScriptが動いたら、idを戻してあげる。

Firefox2、Safari3はこれでOKっぽい。Opera用は後で書く。

ちなみに、wrappedJSObjectにこういう風に値を渡すのはセキュアじゃないはず。

TwitterがjQuery使うようになって、動かなくなってたので素直にblur使うようにした。

Opera

http://ss-o.net/userjs/twitterstopfocus.js

// ==UserScript==
// @name           twitter stop focus opera
// @namespace      http://ss-o.net/
// @include        http://twitter.com/home*
// ==/UserScript==
opera.addEventListener("BeforeScript", function(e){
	if (!e.element.src)
		if (/\$\(["'][\w\-]+["']\)\.focus\(\);?/.test(e.element.text))
			e.element.text = "";
}, false);

srcが空のscript要素で、$(id).focus()に引っかかったら、そのscriptの中身を抹消。別に抹消することはないんだけど、そうしたほうがTwitter側で変更があったときにエラーになるのだけは回避できるかなと。まあ、別の不具合がでる可能性が高いんだけど。

Opera用にはロゴをクリックしたときに履歴に残さずリロードする処理が入っています。

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関数を使わずに書いてみる試み。

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

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

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

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