3.3 ユーティリティ関数

Console Utilities API

DevTools ConsoleにはJavaScript標準にはない便利な関数が用意されている。要素の選択、クリップボード操作、関数の監視など、デバッグを効率化する機能を解説する。これらはConsole内でのみ使用可能で、ページのスクリプトからは呼び出せない。

要素選択関数

$0 〜 $4:選択履歴

Elementsパネルで選択した要素を参照できる。

変数 説明
$0 現在選択中の要素
$1 1つ前に選択した要素
$2 2つ前に選択した要素
$3 3つ前に選択した要素
$4 4つ前に選択した要素
// Elementsで要素を選択した状態で
$0
// → <div class="container">...</div>

$0.textContent
// → 選択要素のテキスト内容

$0.style.backgroundColor = 'yellow'
// → 選択要素の背景色を変更

// 選択要素のスタイルを確認
getComputedStyle($0)

// 選択要素のイベントリスナーを確認
getEventListeners($0)
活用例:要素の比較 2つの要素を順番に選択し、$0$1で比較できる。例えば、スタイルの違いを調べる際に便利。

$() と $$():セレクタ関数

関数 等価なAPI 説明
$(selector) document.querySelector() 最初にマッチした要素を返す
$$(selector) Array.from(document.querySelectorAll()) マッチした全要素を配列で返す
// 最初のh1要素を取得
$('h1')
// → <h1>ページタイトル</h1>

// すべてのリンクを取得(配列)
$$('a')
// → [<a>...</a>, <a>...</a>, ...]

// すべてのリンクのhrefを取得
$$('a').map(a => a.href)

// 特定クラスの要素数をカウント
$$('.item').length

// 画像のsrcをすべて取得
$$('img').map(img => img.src)
$() vs jQuery ページにjQueryが読み込まれている場合、$()はjQueryの$()になる。DevToolsのユーティリティを使いたい場合は$$を使うか、jQueryなしのページで確認する。

$x():XPathセレクタ

XPath式で要素を検索。CSSセレクタでは難しい複雑な条件での検索に有用。

// テキストを含む要素を検索
$x("//p[contains(text(), '重要')]")

// 特定の属性値を持つ要素
$x("//a[@target='_blank']")

// 親要素からの相対検索
$x("//div[@class='container']//span")

検査・表示関数

inspect():要素を検査

指定した要素をElementsパネルで開く。

// 要素をElementsパネルで開く
inspect($('header'))

// 関数をSourcesパネルで開く
inspect(myFunction)

dir():オブジェクトのプロパティ一覧

console.log()がHTMLとして表示するのに対し、dir()はJavaScriptオブジェクトとして表示。

// DOM要素のプロパティを一覧表示
dir($0)

// console.logとの違いを確認
console.log(document.body)  // → HTML表示
dir(document.body)          // → オブジェクト表示

dirxml():DOM要素をXML/HTML表示

// XML/HTMLとして表示
dirxml(document.body)

table():テーブル形式で表示

// 配列をテーブル表示
table([
    {name: 'Alice', age: 25},
    {name: 'Bob', age: 30}
])

// すべてのリンクをテーブル表示
table($$('a'), ['href', 'textContent'])

keys() と values()

// オブジェクトのキー一覧
keys({a: 1, b: 2, c: 3})
// → ['a', 'b', 'c']

// オブジェクトの値一覧
values({a: 1, b: 2, c: 3})
// → [1, 2, 3]

クリップボード操作

copy():クリップボードにコピー

任意の値をクリップボードにコピー。オブジェクトはJSON形式で整形される。

// 文字列をコピー
copy('Hello, World!')

// オブジェクトをJSONとしてコピー
copy({name: 'Test', value: 123})

// 選択要素のHTMLをコピー
copy($0.outerHTML)

// すべてのリンクURLをコピー
copy($$('a').map(a => a.href).join('\\n'))

// APIレスポンスをコピー
copy(await (await fetch('/api/data')).json())
実用例:データ抽出 Webページからデータを抽出してExcelに貼り付けたい場合、copy()を使ってタブ区切りやカンマ区切りでコピーすると便利。

監視・追跡関数

monitor() / unmonitor():関数呼び出しの監視

指定した関数が呼び出されるたびに、引数と共にログ出力される。

// 関数の監視を開始
function greet(name) {
    return `Hello, ${name}!`;
}

monitor(greet)

greet('Alice')
// → function greet called with arguments: Alice
// → 'Hello, Alice!'

// 監視を解除
unmonitor(greet)

monitorEvents() / unmonitorEvents():イベントの監視

要素で発生するイベントを監視。

// すべてのイベントを監視
monitorEvents($0)

// 特定のイベントのみ監視
monitorEvents($0, 'click')

// 複数のイベントを監視
monitorEvents($0, ['click', 'mouseenter', 'mouseleave'])

// イベントカテゴリで監視
monitorEvents($0, 'mouse')  // マウス関連すべて
monitorEvents($0, 'key')    // キーボード関連すべて

// 監視を解除
unmonitorEvents($0)
カテゴリ 含まれるイベント
mouse click, dblclick, mousedown, mouseup, mouseover, mouseout, mousemove
key keydown, keyup, keypress
touch touchstart, touchmove, touchend, touchcancel
control resize, scroll, zoom, focus, blur, select, change, submit, reset

getEventListeners():登録済みイベントリスナー

要素に登録されているイベントリスナーを確認。

// 選択要素のイベントリスナー
getEventListeners($0)

// 特定のイベントタイプのリスナー
getEventListeners($0).click

// リスナー関数の内容を確認
getEventListeners($0).click[0].listener

デバッグ支援関数

debug() / undebug():関数にブレークポイント

指定した関数の先頭で自動的に停止。

// 関数にブレークポイントを設定
debug(myFunction)

// ブレークポイントを解除
undebug(myFunction)

$_:直前の式の結果

直前に評価した式の結果を参照。

2 + 3
// → 5

$_ * 10
// → 50

// 複雑な処理の結果を再利用
$$('a').map(a => a.href)
$_.filter(url => url.includes('https'))

queryObjects():特定クラスのインスタンス検索

メモリ上の特定コンストラクタのインスタンスを検索。メモリリークの調査に有用。

// Promiseのインスタンスをすべて取得
queryObjects(Promise)

// カスタムクラスのインスタンス
class MyClass {}
const obj1 = new MyClass()
const obj2 = new MyClass()
queryObjects(MyClass)
// → [MyClass, MyClass]

クリア関数

clear():Consoleをクリア

clear()

profile() / profileEnd():パフォーマンスプロファイル

// プロファイル開始
profile('My Profile')

// 計測したい処理
for (let i = 0; i < 10000; i++) {
    // 処理
}

// プロファイル終了
profileEnd('My Profile')

実践的な活用例

ページ内の全画像URLを取得

copy($$('img').map(img => img.src).join('\\n'))

フォームの入力値をすべて取得

table($$('input').map(input => ({
    name: input.name,
    type: input.type,
    value: input.value
})))

特定のテキストを含む要素をハイライト

$$('*').filter(el => 
    el.textContent.includes('エラー')
).forEach(el => {
    el.style.outline = '2px solid red'
})

ページ内のすべてのイベントリスナーを調査

$$('*').forEach(el => {
    const listeners = getEventListeners(el)
    if (Object.keys(listeners).length > 0) {
        console.log(el, listeners)
    }
})

localStorageの内容をJSON出力

copy(JSON.stringify(
    Object.fromEntries(
        Object.keys(localStorage).map(k => [k, localStorage.getItem(k)])
    ),
    null, 2
))
参考文献
[1] Console Utilities API reference - Chrome DevTools. developer.chrome.com