Greasemonkeyでサイト既存の関数を上書きする
サイトに新たに機能を付け加えるのではなくて、元々サイトに存在してる関数を少しだけいじってやった方が簡単な場合があります。
そういうときにGreasemonkeyからサイトに元々ある既存関数を上書きする方法です。
SmartLDR更新 – 素人がプログラミングを勉強するブログ : http://d.hatena.ne.jp/javascripter/20090324/1237903880
ここで紹介されているlocation.hrefとjavascript:プロトコルを使ったハックを使うと比較的簡単に関数の上書きができます。
例えばmyFuncという関数を上書きしたい場合は以下のようにjavascript:プロトコルからmyFuncを再定義すると上書きができます。
function evalInPage(fun) { location.href = "javascript:void (" + fun + ")()"; } evalInPage(function () { myFunc = function(){ 上書きする内容 } });
location.hrefとjavascript:プロトコルを使って実行するとXPCNativeWrapperの外側でスクリプトを評価できる(Greasemonkey内の評価ではなくなる)ので、unsafeWindowを使わなくても既存の関数に触ることができます。
逆にGreasemonkey内の評価ではなくなるので、GM_関数は使えなくなります。(感覚的にはブックマークレットを実行するのと同じ)
これを同期的に扱いたいならJSDeferredを使って下のように組み込むといいらしい。
unsafeExec on JSDeferred – 枕を欹てて聴く : http://d.hatena.ne.jp/Constellation/20090326/1238073714
9washのRTフォーマットを一般的なものに変更するのにこの方法を使ってみた。
9washはブラウザから利用できるWeb twitterクライアントです。
軽くて使い易いので、いいクライアントだと思いますが、RTのフォーマットが[RT:数字id @ユーザー名]みたいになっていて、使いにくかったのでその部分の関数を上書きして、よく使われているようなRT @ユーザー名:の書式に変えるようにしてみました。
9wash twitter clientについて : http://tw.9wash.com/about
お知らせ欄
JavaScript Primerの書籍版がAmazonで購入できます。
JavaScriptに関する最新情報は週一でJSer.infoを更新しています。
GitHub Sponsorsでの支援を募集しています。