恥ずかしながら今まで jQuery ばかり使用していたので document.querySelector
の存在を知らなかったのでメモ。
Laravel の Blade テンプレート内でデフォルトで head
要素内に以下のように meta
タグで CSRF トークンが出力されている:
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="csrf-token" content="{{ csrf_token() }}">
...
</head>
上記は Blade 内なので {{ csrf_token }}
という Blade の記法で取得できるが、この値を Vue.js のコンポーネント内で取得するのに meta
タグから取り出す必要があった。
そこで私は最初「jQuery なら一発で取れるのに」と思いながら以下のように書いてしまった:
/**
* メタ要素から CSRF トークンを取得する.
*
* @returns {string} CSRF トークン
*/
csrfToken() {
let children = document.head.children;
for (const child of children) {
if (child.getAttribute('name') === 'csrf-token') {
return child.getAttribute('content');
}
}
return null;
}
しかしこれを書き終えた後で「Laravel で使われている Axios でヘッダに CSRF トークンを付与しているはずだがそこはどうやっているのか」と思い bootstrap.js
を参照してみたら以下のように書かれていた:
let token = document.head.querySelector('meta[name="csrf-token"]');
if (token) {
window.axios.defaults.headers.common['X-CSRF-TOKEN'] = token.content;
} else {
console.error('CSRF token not found: https://laravel.com/docs/csrf#csrf-x-csrf-token');
}
この querySelector
というのを知らなかったのだが、どうも CSS の記法でセレクタを記述することで jQuery のように DOM 要素を取得できる DOM のメソッドらしい。
最近できたのかと思いきや IE8 から利用可能なようで意外とレガシーなものだった……。
最初の 1 件を取得したい場合 querySelector
を使用し、複数件数取得したい場合は querySelectorAll
を使用する。
これから Vue.js のようなモダンな JS フレームワークをメインとし脱 jQuery としていくにあたって必須知識だろう。 覚えておきたい。