さて、前回はConsole APIの解説とそれを利用してのデバッグについて簡単な解説を行いました。
今回は、Firebugに実装されているもう1つのAPIである、Command Line APIや、各タブの機能を利用してのデバッグ方法について解説をしていきたいと思います。
Command Line API
Command Line APIはFirebugのConsoleタブから利用することができます。ただし、グローバルですでに利用されている名前については利用できません。例えばPrototypeやjQueryが利用されているページのConsoleでは$()関数はそれらのライブラリのものが実行されます。
利用できるAPIは以下の通りです。
- $(id)
- IDを渡すと、そのID属性のHTML要素を返します。
- $$(selector)
- CSSセレクタを渡すと、該当するHTMLの要素を配列で返します。
- $x(xpath)
- XPathを渡すと、該当するHTMLの要素を配列で返します。
- dir(object)
- 渡されたオブジェクトのプロパティと値を全て出力します。
- dirxml(node)
- 渡されたノードのソースツリーを表示します。HTMLタブと同様に表示され、クリックすることでHTMLタブで確認することができます。
- cd(window)
- Conosoleタブのコマンドラインはデフォルトではそのページのトップレベルのウィンドウで実行されます。このコマンドにより、例えばそのページの別フレーム内でJavaScriptを実行したい場合は、このコマンドで実行したい別フレームを指定します。
- clear()
- Consoleタブの表示をクリアします。
- inspect(object[, tabName])
- 渡されたオブジェクトをもっとも最適なタブで解析します。tabNameを指定すると、そのタブで解析され、そのタブによって解析できないオブジェクトの場合はもっとも最適なタブで解析されます。利用できるtabNameは「html」「css」「script」「dom」です。
- keys(object)
- 渡されたオブジェクトの全てのプロパティ名を配列で返します。
- values(object)
- 渡されたオブジェクトの全ての値を配列で返します。
- debug(fn)
- 指定された関数オブジェクトの先頭にブレークポイントを設定します。
- undebug(fn)
- 指定された関数オブジェクトの先頭のブレークポイントを解除します。
- monitor(fn)
- 指定された関数オブジェクトの呼び出しを監視します。その関数オブジェクトの呼び出し先や関数オブジェクトに渡された引数をconsoleに表示させます。
- unmonitor(fn)
- monitorによって監視されている関数オブジェクトの監視を解除します。
- monitorEvents(object[, types])
- 渡されたオブジェクトに対するイベントを監視することができます。typesに、監視対象とするイベントのタイプを指定することができます(mouse、key、等)(※1)
- unmonitorEvents(object[, types])
- monitorEventsによってイベントを監視されているオブジェクトのイベントの監視を解除します。(※1)
- profile([title])
- profileを実行してから、profileEndを実行するまでに実行された関数の解析を行います。
- profileEnd()
- profileによる解析を停止して結果を表示します。
- copy(x)
- 渡された文字列をクリップボードにコピーします。
Command Line APIを利用してHTMLを解析する
さて、さっそくCommand Line APIを利用していろいろなウェブサイトを解析してみましょう。
まず、Yahoo! JAPANのトップページを開いてください。$$()関数を使って、ニュースへのリンクを抽出してみます。consoleに次の1行を入力して実行してください。
すると、ニュースへのリンクのみが抽出された結果が表示されます(図1)。
また、このコード(リスト1)は次のように$x()関数を用いても同じことが行えます。
さらに、以下のコードのように変更することで、抽出したリンクをまとめて開いてくれます(大量のウィンドウが開くので注意してください)。
このようにCommand Line APIはデバッグだけでなく、普段のブラウジングにも活用することができます。
関数呼び出しをmonitorで監視する
monitor関数によって、関数の呼び出しを監視してみましょう。次のサンプルスクリプトを見てください。
Funcという関数は、渡された引数の型を返すだけの単純な関数です。exec[1-3]というIDを持つHTMLを用意して、それぞれ「文字列」「数値」「オブジェクト」を渡すようになっています。
これらが記述されたページ(open(this.href);return false" onkeypress="window.open(this.href);return false">ex01.html)を開き、monitor関数によってFunc関数を監視してみましょう。consoleに、次の1行を入力してください
この状態でそれぞれの要素をクリックすると、次のように表示されます(図2)。
このように、monitorによって監視されている関数が呼び出されるたびに、どのような引数で呼び出されたかがconsoleに出力されます。
また、引数がオブジェクトであったり、HTMLの要素の場合はそれぞれconsole.logの出力と同じように、適切なタブへのリンクとなっているため、特にその様な要素を引数として渡す関数の監視のデバッグに便利です。
monitorEventsでイベントを監視する
moniorEventsを利用して、ドキュメントの全てのクリックを監視してみましょう。
以下のように、第1引数に"document.body"を渡すことで、そのドキュメントにおける全てのイベントを監視させることができます。なお、今回はclickのみを監視したいため、第2引数として"click"を渡します。
先ほどのページ(open(this.href);return false" onkeypress="window.open(this.href);return false">ex01.html)で上記のスクリプトを実行し、ドキュメント内の適当な場所をクリックしてみてください。
すると次のようにclickによって発生したイベントがconsoleに出力されます(図3)。
例えば、サンプルページの「Firebug sample.」という文字の部分をクリックすると、次のようにイベントオブジェクトを参照することができます(図4)。
XML HTTP Requestを確認する
さて、APIの解説は以上にして、ここからはそれ以外のFirebugを利用したデバッグについて説明します。
Firebugでは、XML HTTP Requestの内容を内容を確認することができます。まずは、FirebugでXML HTTP Requestの表示が有効になっているかを確認してみましょう。consoleタブのoption(図5)において、[Show XMLHttpRequests]の部分にチェックが入っていればOKです(図6)。
XML HTTP Requestの内容を確認してみましょう。Yahoo!JAPAN トップページを開いてください。その後、トピックスの「エンタメ」タブをクリックしてみてください(図7)。
すると、consoleタブに次のような表示がされたと思います。
さらに、クリックするとXML HTTP Requestの詳細を参照することができます(図9)。
ここでは、リクエストによって渡されたパラメータ「Params」とHTTPヘッダ「Headers」、レスポンス「Response」を参照することができます。
このようにFirebugでは、XML HTTP Requestを利用したJavaScriptのデバッグを容易に行うことができます。
HTMLタブでHTMLのリアルタイム変化を監視
Firebugでは、JavaScriptによるHTMLの変化をリアルタイムに監視することができます。また、変化したHTMLをハイライトさせて表示することもできます。このハイライト表示のために、HTMLタブのオプションで[Highlight Changes][Expand Changes][Scroll Changes Into View]にチェックをいれましょう(図10)。
これらをONにすることで、変化されたHTMLを追跡しやすくなります。
それでは、次のサンプルコードが埋め込まれたサンプルページ(open(this.href);return false" onkeypress="window.open(this.href);return false">ex02.html)を用意しましょう。
また、HTMLも用意します。
次のようなページが表示されるので、タブをHTMLに切り替えて、Move!とColor!のボタンをそれぞれクリックしてみましょう(図11)。
すると次のようにHTMLタブで変化したHTMLの部分がハイライトして表示されると思います(図12)。
このように、HTMLタブではHTMLの変化をリアルタイムに監視を行うことができます。この例では、第1回で取り上げたFirebugのメリットの一つ「リアルタイム性」の部分を実際に体感できたと思います。
次回予告
さて、次回はscriptタブでのデバッグ方法、Firebugの拡張アドオン「YSlow」、Firebugのこれから、について紹介したいと思います。