nikkansports.comで右クリックを有効にしたい。その2

昨日挫折しかかったnikkansports.comの右クリックを有効にするぐりもんの記事にid:poolmmjpから

getElementsByTagNameにして、返るのはリストだからループするなり[0]だけ処理するなり。さらにoncontextmenu=handlerじゃなく、setAttribute ('oncontextmenu', handler)。あとonload存在チェック。

とブクマコメントをいただいたので早速試してみました。ぷーるさんどうもありがとうございます!

(function(){
	var w = (typeof unsafeWindow == 'undefined') ? window : unsafeWindow;
	function handler(){ return true }
	function unprotect(){
		with(w){
			var body = document.getElementsByTagName('body');
			if(body[0]){
				body[0].setAttribute('oncontextmenu', handler);
			}
		}
	}

	var onload = w.onload;
	if(onload){
		w.onload = function(){
			onload();
			unprotect();
		}
	}
})();

まず、getElementByTagNameはtypoじゃなくて、両方あんのかな?くらいに思ってました。切ない気分になるね ><

最後のところなんですが、onloadをチェックっていうのはこういうことかな?としたんだけど、これじゃうまく動かない。どうもonloadがnullのようでifの中に入らないみたい。ifをとってFireBugでみるとこのonloadがないよーってエラーが出てる。

そこで下のように書いたら動いてる。エラーもでないみたい。

(function(){
	var w = (typeof unsafeWindow == 'undefined') ? window : unsafeWindow;
	function handler(){ return true }
	function unprotect(){
		with(w){
			var body = document.getElementsByTagName('body');
			if(body[0]){
				body[0].setAttribute('oncontextmenu', handler);
			}
		}
	}

	var onload = w.onload;
	if(onload){
		w.onload = function(){
			onload();
			unprotect();
		}
	}else{
		unprotect();
	}
})();

ちょっと調べてみたらわかりました。Greasemonkeyの開発をまとめてみるによると、

  • unsafeWindowっていうのはGreaseMonkeyが動いているページのこと。
  • unsafeWindowから元のページの関数を呼ぶことができる。
  • これでLDRのヒトをしゃべらせたりできる。

で、上のスクリプトでは「元のページのonload関数を上書き」しようとしてるからonload関数が定義されてないnikkansports.comではここがnullになる。ということらしい。

このスクリプト最速インターフェース研究会 :: アメブロのオフィシャルブログ画像保護機能を無効化するGreasemonkeyスクリプトを真似させてもらったんだけど、このスクリプトの対象はアメブロだからアメブロでは定義されてるonloadを上書きするという仕様になってるということなんだと思う。

そのままロクに理解もしないで丸パクりしてごめんなさい ><
つーことはifとかelseなんてしないで直にunprotect();で良いのかな。 動くことは動いてる。oncontextmenu使って右クリック禁止してるサイトさんで汎用的に使えるようにするためにはどうするんだろ。

スクリプトはとりあえずここにおいておきます。
permit_right_click.user.js
たぶんnikkansports.comに限らずoncontextmenuで右クリ禁止のサイトではそれなりに効果があるはず。一応nikkansports.comでしか発動しないようになってるんで適宜追加してください。

nikkansports.comで右クリックを有効にしたい。

別に普段は気になってなかったんだけど、今日ふとtumblrにshare on tumblrから投稿しようと思ったら右クリックが無効になってた。ソースを見てみると

<body id="soccer" oncontextmenu="return false">

っていうベタなヤツ。
これを無効にするぐりもんをと思ってこんなのを書いてみた。ちなみにぐりもんデビュー。というかJavaScriptデビュー。

(function(){
    function handler(){ return true }
    var body = document.getElementByTagName('body');
    if(body){
        body.oncontextmenu = handler
    }
})();

でうまくいかなかったので、最速インターフェース研究会 :: アメブロのオフィシャルブログ画像保護機能を無効化するGreasemonkeyスクリプトを参考にして書き直してみた。

(function(){
    var w = (typeof unsafeWindow == 'undefined') ? window : unsafeWindow;
    function handler(){ return true }
    function unprotect(){
        with(w){
            var body = document.getElementByTagName('body');
            if(body){
                body.oncontextmenu = handler;
            }
        }
    }
    var onload = w.onload;
    w.onload = function(){
        onload();
        unprotect();
    }
})();

これでも動かなかった。とりあえずFireBugではエラーは出てないから動いてはいるっぽいけど、その辺の動作確認の仕方がよくわからない ><

要研究と言うことで。

自分のpostだけ見ることができたりするFilterができてた。


いつものようにDashBoardを眺めてたら見慣れない虫眼鏡のアイコンができててFilter機能が使えるようになってた。Filterではpostの種類(Photo,Text,Videoなどから選択)、投稿者の種類(自分と全員のどちらか)を選択できる様子。v3になって自分だけの投稿を見ることができなくなってたから便利っちゃー便利かも。でもごった煮になってるDashBoardが好きだから使わないかもなあ。

MouseoverDictionaryと英辞郎第一版

これまで辞書用の拡張としてDictionary Tooltipを使っていたんだけど、リンクされている文字列を引けないのがちょっと不便だったんでマウスカーソルを乗っけるだけで意味を表示してくれる*1MouseoverDictionaryを試してみた。

MouseoverDictionaryは便利なんだけどサイドバーを開いていないといけない点、それから辞書を自分で用意しないといけない点が短所になるんじゃないかと思う。長所はローカルに辞書を読み込んでsqliteを使ってDBとして持つのでネットワークにアクセスしないこと。使ってみた感じ、表示までのタイムラグが全くと言っていいほど無い。英辞郎とか持っている人ならおすすめだと思います。

僕は大昔に買った英辞郎の第一版しかないのでこれを使ってみることにしたんだけど、配布サイトで公開してる手順に則って辞書の形式をPDIC一行形式に変換してみてもうまくいかない。すべての単語についてうまくいかないんじゃなくて「Mac」は引けるけど「dictionary」は表示されない*2という中途半端な状況。どうも発音についての項目が【@】で始まっているのが問題だったらしく*3、発音表示がある単語で表示に問題があったみたい。

一行形式に変換した後で【@】を《@》に置換して読み込ませてみたら無事に使えるようになった。別に《@》にする必要はなくて【】を使っていなければ平気なんじゃないかと思う。いまさら英辞郎の第一版を使う人なんかいないと思うけど自分のためにメモ。

*1:ただしサイドバー

*2:辞書にないという表示もでない

*3:たぶん第二版以降では変更されているんだと思う

グッとガッツポーズで。

14日エントリWiiリモコンにダブルクリックを割り当てて、ガッツポーズしたらいいんじゃね?みたいなことを書いたんだけど、ゼロメムはてな支店でkuさんがホントに実装してくれた!!

wiiremocomつないで下のコードをgmでもwiiremocomにハードコードでも実行しておいたらwiiremoteをがつんと振ったらon/offが切り替えられる....

ネットってすげーなー。id:ku0522ありがとうございます。

Autopagerizeの2ページ目以降でLDRizeが効かなくなった。

AutopagerizeをいろいろいじったりアップデートしてたらAutopagerizeで結合された2ページ目以降でLDRizeが効かなくなった。LDRizeが壊れたのかと思って再インストールしたら直ったので勝手に壊れたのか*1、なんかいじったのを忘れてたのかと納得してた。

その後、TumblrでReblogしようと思ったらGreaseMonkeyのロード順の関係でLDRize Mibuffer tumblr reblog commandがうまく動かない。reblog commandはLDRizeの後にロードされないといけないためLDRizeをreblog commandの前に移動したら、LDRizeが動かない状況が再現された。

ここまで来てやっとLDRize動かないのはAutopagerizeの前にロードされていたのが原因なんじゃないかってことに気がついた。つまり、Autopagerizeを書き直したり入れ替えたりしている間にうっかり新規インストール扱いになってしまってロード順がLDRizeAutopagerizeになってしまっていたというわけ。

整理するとGreaseMonkeyのロード順は

Autopagerize
  ↓
Minibuffer
  ↓
LDRize
  ↓
LDRize Mibuffer tumblr reblog command

でないとうまく動かない。このほかにももしかしたら順番依存のGreaseMonkeyがあるのかもしれないけど、とりあえずインストールしてあるのだとこれだけでした。もしまだなんかあったら教えてください。

*1:そんな訳ないけど

pagerizeをダブルクリックで制御するように変更

昨日のAutopagerizeの先読み位置を変更してより快適にブクマコメントで、id:otsune

Pagerizeしてほしくない時も有るんだよな。誤爆防止に右上の■で切り替えれば良いけど。グッとガッツポーズしたら無効とかほしい

といってて、そーだよな。と納得した。
でもAutopagerizeってダブルクリックで制御できるんだからWiiリモコンかなんか握りしめてガッツポーズすればいいんじゃね?って思って確認してみたら*1、ダブルクリックでon/off制御できなくなってた。配布元のid:swdyhによると、

久しぶりにアップデートしました。
わりと細かい部分の修正です。

  • 右上のところでon/offの切り替え
  • ダブルクリックの切り替え廃止
  • エラーの表示を追加
  • console.logはDEBUG_MODEのみ (通常時はunsafeWindowは使わないように)
  • 右上のにid名を追加(autopagarize_icon, autopagarize_help)
  • addFilterで追加したものの実行をページの追加後に変更
  • 継ぎ足しして高さがほとんど増えていない場合ストップ (DOS攻撃対応)
AutoPagerize0.0.13 - SWDYH

仕様変更があったとは。そういえば最近ダブルクリックしても効かないなーとは思ってたんだよね*2。というわけでダブルクリックでon/off制御できるようにいじってみた。

使ったのは現行のver.0.0.17。

--- autopagerize.user.js	2007-11-14 19:43:56.402724800 +0900
+++ autopagerize.user.new.js	2007-11-14 19:44:21.448739200 +0900
@@ -80,6 +80,7 @@
     this.loadedURLs = {}
     var toggle = function() {self.stateToggle()}
     this.toggle = toggle
+    document.body.addEventListener("dblclick", toggle, true)
     GM_registerMenuCommand('AutoPagerize - on/off', toggle)
     this.scroll= function() { self.onScroll() }
     window.addEventListener("scroll", this.scroll, false)
@@ -295,6 +296,7 @@
 AutoPager.prototype.terminate = function() {
     this.icon.style.background = COLOR['terminated']
     window.removeEventListener('scroll', this.scroll, false)
+    document.body.removeEventListener("dblclick", this.toggle, true)
     var self = this
     setTimeout(function() {
         self.icon.parentNode.removeChild(self.icon)

これでダブルクリックで制御できるようになるのであとはWiiリモコンとかで各自工夫すること。

*1:あわよくばホントにWiiリモコン握ってガッツポーズしてみようと思ってた

*2:鈍いにもほどがある