複数スクリプトの相性問題 & 0.6.4対応
Firefox 1.0.7 + Greasemonkey 0.5.3 の時の話ですが、同一ページで複数のgreasemonkeyスクリプトが動かないという問題に直面しました。
詳しく調べると、正規表現でマッチした結果のオブジェクトがグローバルなため、一方のスクリプトが処理した結果のRegExp.$1(など)を別のスクリプトのRegExp.$1が上書きして、いやーんな結果になっていたという。
まぁ、片一方は使わないので問題ない。
……のだけど、使わない方=はてなグリースモンキーとして掲載されている物で、使う物=同時に使うと不具合の出るもの=自作物、なのが悩ましい。気にしないのが一番だけど。
どうせ他人はそれほど人の作った物に期待はしない。
[追記してみる]
具体的に問題となったのは
簡単写真挿入スクリプト(http://www.hatena.ne.jp/info/greasemonkey/HatenaDiaryMyFotoMenu.user.js)
var saveIntervalID; if (location.href.match(/http:\/\/d\.hatena\.ne\.jp\/([^\/]+)\/edit/)) { // Diary var isPreview = document.evaluate( '/descendant::p[@class="message"]', document, null, XPathResult.BOOLEAN_TYPE, null).booleanValue; if (isPreview) return; userName = RegExp.$1; // userName = "another_user_name";
のuserName取得している所の「RegExp.$1」が、自作の編集画面にカレンダー表示するスクリプト(http://homepage1.nifty.com/inami/hatenadiaryEditDateFromCalendar.user.js)
// 日付をURLからセット function editDateFromURL() { var urldate; location.href.match(/.*edit\?date=(\d{8}$)/); if (RegExp.$1) { urldate = RegExp.$1; } else { return; //日付が8桁じゃないとか数字じゃないとか } urldate.match(/^(\d{4})(\d{2})(\d{2})$/); var y = RegExp.$1; var m = RegExp.$2; var d = RegExp.$3;
の
urldate.match(/^(\d{4})(\d{2})(\d{2})$/); var y = RegExp.$1;
この1行目と2行目の間に割り込んでくる(?)、と言う物。
自作の方はこれでyを年の所につっこむので、簡単写真挿入が有効だと下の写真のようになってしまう(苦笑)
*
まぁ、そんなことは置いておき、Firefox 1.5 + Greasmonkey 0.6.4で動かなくなった自作物の修正が、目下の所の問題。
Greasemonkey 0.6.4で起こる問題として
- XMLHttpRequestが使えない(GM_略を使うらしいが、元々使っていない)
- 0.3.xや0.5.x系では通っていた日本語コメントが、syntax errorの原因になることがある
- イベントハンドラが特定形式しか使えない
document.captureEvents(Event.MOUSEMOVE); document.onmousemove = setpos;
とか書いていたけれど、Eventオブジェクトは無いし、onxxxxx →onXxxx になっているし、やっぱり動かんし…orz
いつまでたっても直らない…
addEventListener形式になおしたけど、テストするのは帰ってからになりそう。
[こちらも追記]
動くようになった。もうちょっと整形したら、もう一度書く。