Modifiedあんまり変更されないnarucissusブログ。コンピュータに関する子ネタと備忘録。2007Greasemonkeyで遊ぶ(その1)仕事中になかなかRubyを書くわけにもいかず、やっぱりJavaScript書いてることのほうが多い今日この頃はGreasemonkeyで自分好みにいろんなサイトを変更するのが仕事の合間のマイブームになりました。普通のブラウジングをOperaに頼ってる私としては重宝します。Greasemonkeyじゃない普通のページでやりたい処理を実現してからそれをJSで出力するように移行するように作業をしています。そこで以下のような例外に遭遇。no]Operaでは動くのになんでだーと思いながら調べると、どうもobj.onclick=function(){}は使えないというブログのエントリを発見。検索を続けたところ以下のオライリーのサイトにたどり着きました。Greasemonkey本当だったようです。この記事が非常に役に立つのでメモっておきます。翻訳チョー適当なので勘弁してください。1000);のように関数の文字列を渡すことができます。内部では実行時に文字列を評価(eval)してくれているようです。これがGreasemonkeyでは動かないらしい。1000);のように無名関数を直接埋め込んでしまえば正しく実行されます。onclickやonchangeやonsubmitのようなイベントハンドラを使用したケースです。私はよく以下のように書きます。onclick');};これがダメ。上記のようなコードではelementにonclickを設定するコードにはならないというもの。(idやclassNameのようなプロパティはXPCNativeWrapperがちゃんとラッピングしているElementの値を返すようです)これを回避するにはaddEventListener関数を使えとのこと。上記のコードの代わりにこう書きます。Elements(落とし穴3:名前を付けたフォームとフォーム要素)以下のようになっているフォームがあるとき。value="foo"></form>以下のような書き方でqの値をとることができないようです。これもXPCNativeWrapperがあるためにできないとのこと。以下のようなコードはエラーにはなりませんが、意図した通りに動きません。自分でオリジナルのプロパティを付けたい場合は以下のようにsetAttributeを使います。'bar');セットした値を取得するにはgetAttributeを使います。ここでちょっとハマったので注意。getAttributeの戻り値は必ずString型になるようです。フラグをセットする場合などはそのままfalseをセットするだけではダメですね。以下の例を見てください。obj[j]);}変数listは([]を使って)配列として定義しています。この配列のすべての要素にアクセスするときにはfor(;;)を使います。これに対して変数objは({}を使って)連想配列(またはオブジェクト)として定義しています。この連想配列の要素にアクセスするときにはfor(in)を使います。ブラウザが意図したとおりに実行してしまうせいか、配列に対してfor(in)を使用するケースが多いです。引用元では上記のようには書いていませんが、これがダメだよということだと思います。(違っていたら詳しい方コメントください)あと5つもある...続きはウェブで。はまってたので助かりました。実装を知らなかっただけという感じかも知れないですけど、自力で探してたらなかなか原因が分からなかったと思います。調べてみたら、MDCでもちゃんと説明されてますね。(2)自己紹介narucissus仙台で働くSE。LAPPでWebアプリケーション作成を主に行っています。最近はJavaScriptがアツイです。MDCJavaScriptのリファレンスはMDC。