SSブログ

JavaScript で Beep 音を鳴らすには? [NT]

残念ながら、少なくとも Mozilla Firefox では JavaScript(例えば Greasemonkey で) で Beep 音を鳴らすことはできない。

Firefox のソースコードを調べると Beep 音を鳴らす API は存在しているが、それを JavaScriptから呼び出すことはセキュリティの問題で出来ない。

しかし、Firefox のアドインを作れば、その中では可能である。GeckoFX Forum / Play sounds で音を鳴らす方法が解説されており、その中でビープ音についてもサンプルが掲載されている。

しょうがないので、Greasemonkey 自体を改良してビープ音をならす方法を考える。例えば、Greasemonkey は GM_log のような独自関数を定義しているから、GM_beep というビープ音をならす関数を Greasemonkey 自体に追加してしまえば良い。

Greasemonkey のソースコードを読んでみたところ、案外簡単にできそうだ。具体的には、 utils.js に GM_beep を定義して、greasemonkey.js の「add our own APIs」というコメントがある部分に追加すれば動きそうだ。

 

と、ここまで調べておきながら、 とある事情で「JavaScript で Beep 音を鳴らす必要」が無くなってしまったので実装はしていない。需要があるなら Greasemonkey の patch として作るけど...


iKnow! を改良しよう その4 ~prototype.js~ [NT]

iKnow! を改良しよう その3 ~やりなおし~ の続き。

smart.fm の JavaScript を Venkman JavaScript Debugger でもう一度追いかけてみた。

少しだけ謎が解けた。マイリストで次へをクリックすると Ajax.Request が作られるけれども、そのリクエストの結果は Element.update である。この結果を domplate.js が eval して html として挿入している。

で、domplate は Prototype.js が呼び出している。要点は this.initialize.apply にあるっぽい。あとは bind という考え方。smart.fm の JavaScript コードは全面的に Prototype.js に依存した記述方法になっているから(Prototype JavaScript framework だから分からなくもない)、コードを読み解くためには Prototype.js の知識が必須。

これを追っかけるのはちょっと手間なので、マイリストの「次へ」などをクリックしたときに Grasemonkey を実行させるのは保留。

Grasemonkey に構っているより、他に書きたいコードがあるので...

iKnow! を改良しよう その5 へ続く。


iKnow! を改良しよう その3 ~やりなおし~ [NT]

2009/3/3 ~ 2009/3/4 に iKnow! のサイトがリニューアルされ URL も smart.fm へと変わった。さらにデザインも一新された。そのため、iKnow! を改良しようiKnow! を改良しよう その2 ~リストの取得~で述べた事が古くなってしまった。 

残念。しかし、XPath の使い方を理解したのでより綺麗なコードが書けるかもしれない(し、あまりそうならないかも orz) 。

で、ちょっと改良してみたところ、ver.0.1 レベルのものは出来た。もう少し改良したらスクリプトごと掲載するつもり。cerego 社に怒られないと良いなぁと思う。

閑話休題。

smart.fm の「マイリスト」ではリストが多くなると「前へ」や「次へ」みたいなボタンが表示されるようになる。

image.gif

このボタンをクリックすると、 UserListUpdater.showLoading() 関数が呼び出されて読み込み中を表す画面が動的に表示され、その後、 new Ajax.Request を使ってサーバからリストの内容を取得しリストが切り替わる。

私としては、リストが切り替わったら、Greasemoneky を再実行して欲しい。 これはどうやったら実現できるだろうか。

showLoading を再定義すれば出来るかなと考えたが、new Ajax.Request からのレスポンスが返ってきてから実行しなければならない。new Ajax.Request の部分にイベントハンドラがあれば、そのイベントハンドラを書き換えてしまえば良いが、smart.fm のコードをちょっと見る限りではどうやっているか掴めていない。

どうしようかなぁー。onclick の内容を再定義してしまえばどうにでもなるけど、もっと良さそうな手があるような気がする。

ちなみに、Ajax.Request は prototype.js にある。

iKnow! を改良しよう その4 ~prototype.js~ へ続く。


JavaScript で関数を再定義するには? [NT]

自分以外の作った JavaScript コードがあって、showLoading というメソッドが定義されているとする。で、showLoading が呼び出された後に、自分の書いた JavaScript コードを呼び出して欲しい場合、どうしたら良いか。

次のように記述すると、それが可能になる。

このコードは、

  • showLoading 関数の中身を prev_showLoading 関数に複製する。
  • showLoading は prev_showLoading 関数を呼び出した後、alert を表示する。

ということを行っている。このように記述すると、showLoading を呼び出している側を一切変更しなくても showLoading に機能を追加できる。

JavaScript ってとても動的な言語なんですね。


タグ:JavaScript

DOM element の不必要な要素を削除するには? [NT]

DOM で、あるエレメントの親(とその祖先)以外を削除したい。こういう機能を何と呼べば良いかよく分からないが、Firefox のアドオン ScrapBook を作成されている Gomita 氏は「DOMノードのアイソレート」と呼んでいる。

Gomita 氏のブログでは そんな DOMノードのアイソレート を行うコードを公開している。結構便利だ。しかし、DOM element を移動するには? のエントリで書いた方法を使っても私のやりたいことは出来ることが判明。とりあえず、備忘録代わりにエントリとして残しておくことにする。

ちなみにここで言う DOM とは JavaScript でよく使う Document Object Model (DOM) を指す。


DOM element を移動するには? [NT]

Greasemonkey で JavaScript を書いていると、ある条件に該当する DIV 要素を別の条件に該当する部分に動かしたいということが たまに ある。プロバイダに怒られてしまいそうなので、具体例は書かないが。


ところで、ソネくじの庭の水やりとかソネくじ発行とかめんどくさいよねぇ...いちいちスクロールしないといけないし...

閑話休題。

「DOM element を移動するには?」の問いに対する回答としては Script雑感: Javascript:エレメントの位置をコロコロと変える。 で紹介されている関数群を使うととても簡単にできる。例えば、ある div 要素(とその子ども)を body の先頭にするとか。自分で作っても良かったのだが、あるものはありがたく使わせて頂くということで...。


この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。