takeopera RSSフィード

2005 | 10 | 11 | 12 |
2006 | 01 | 02 | 03 | 04 | 07 | 08 | 09 | 10 | 11 | 12 |
2007 | 02 | 03 | 04 | 05 | 06 | 11 | 12 |
2008 | 01 | 09 | 10 |
2009 | 01 | 02 | 03 | 06 |

2008/10/16 Thu

[]onload時のfocusを無効にする 00:37 onload時のfocusを無効にする - takeopera を含むブックマーク はてなブックマーク - onload時のfocusを無効にする - takeopera onload時のfocusを無効にする - takeopera のブックマークコメント

// ==UserScript==
// @name          kill onload focus
// @namespace     http://orera.g.hatena.ne.jp/takef/
// @include       *
// ==/UserScript==

(function () {
	var inputFocusFunc = HTMLInputElement.prototype.focus;
	var textareaFocusFunc = HTMLInputElement.prototype.focus;

	opera.addEventListener('BeforeScript', function (e) {
		HTMLInputElement.prototype.focus = function(){};
		HTMLTextAreaElement.prototype.focus = function(){};
	}, false);

	document.addEventListener('load', function (e) {
		setTimeout(function() {
			HTMLInputElement.prototype.focus = inputFocusFunc;
			HTMLTextAreaElement.prototype.focus = textareaFocusFunc;
		}, 500);
	}, false);
})();

Twitterのスクリプトが変更されるたびにその場しのぎで対応するのが面倒になったので、どんなサイトでも対応できるようなのを作った。

やってることは難しくなくて、スクリプトの実行前にfocusをダミーの関数に置き換えて、onloadの0.5秒後に元に戻しているだけ。

追記(2008/10/19)

いただいたコメントを元に修正しました。

// ==UserScript==
// @name          kill onload focus
// @namespace     http://orera.g.hatena.ne.jp/takef/
// @include       *
// ==/UserScript==

(function () {
	var inputFocusFunc = HTMLInputElement.prototype.focus;
	var textareaFocusFunc = HTMLTextAreaElement.prototype.focus;

	HTMLInputElement.prototype.focus = function(){};
	HTMLTextAreaElement.prototype.focus = function(){};

	document.addEventListener('load', function (e) {
		setTimeout(function() {
			HTMLInputElement.prototype.focus = inputFocusFunc;
			HTMLTextAreaElement.prototype.focus = textareaFocusFunc;
		}, 500);
	}, false);
})();

edvakfedvakf2008/10/18 00:12var textareaFocusFunc = HTMLInputElement.prototype.focus;

var textareaFocusFunc = HTMLTextAreaElement.prototype.focus;
の間違いですね。
これでやると、はてなダイアリー (例えばこのページなど) で、onload 後に focus 関数が元に戻ってないと思うのですが、再現しますか? 他のページでは大丈夫っぽいんですけど。

os0xos0x2008/10/18 06:06BeforeScriptはJSONPとかの後から追加したscriptにも反応するので、はてなスターなどで「focus 関数が元に戻ってない」現象(正確には、戻した後にまた消してる現象)が起きるみたいです。

この場合、BeforeScriptを使う必要がないかなと思います。
delete で自分が定義したプロパティを消すことができるので、こんな感じにすることもできます。
HTMLInputElement.prototype.focus =
HTMLTextAreaElement.prototype.focus = Function();
window.addEventListener('load', function () {
setTimeout(function() {
delete HTMLInputElement.prototype.focus;
delete HTMLTextAreaElement.prototype.focus;
}, 500);
}, false);

edvakfedvakf2008/10/18 06:23os0xさんのおっしゃる方法で大丈夫そうなのですが、僕のコメントした件については下の方法で解決しましたので、お知らせしておきます。
http://d.hatena.ne.jp/Griever/20081017/1224261825

takeftakef2008/10/19 17:04>edvakfさん
わ、はずかしいミスですね。ご指摘感謝。

>os0xさん
おお、確かにBeforeScriptは使う必要がないですね。
そしてJSONPのことは想定外というか忘れてました。
ありがとうございます。

ちょっと気になったんですが、delete使ってしまうと元々あったfocusが消えてしまわないですか?




それにしてもコメント入力欄が小さすぎる・・・
あとでなんとかしよう。

トラックバック - http://orera.g.hatena.ne.jp/takef/20081016
2005 | 10 | 11 | 12 |
2006 | 01 | 02 | 03 | 04 | 07 | 08 | 09 | 10 | 11 | 12 |
2007 | 02 | 03 | 04 | 05 | 06 | 11 | 12 |
2008 | 01 | 09 | 10 |
2009 | 01 | 02 | 03 | 06 |