[JavaScript] 不正なセレクタをエスケープする際の対処法
2 min read
セレクタとして不正な文字
まず数値から始まるセレクタは使用できない。
かつ、下記の文字列は先頭に限らず使用することは出来ない。
~ ! @ $ % ^ & * ( ) _ + - = , . / ' ; : " ? > < [ ] { } | ` #
これらの文字は制御コードに置き換える事で valid なセレクタとして使用することも可能だが、簡単にバックスラッシュでエスケープすることもできる。
<span id="~">text</span>
#\~ {
color: red;
}
document.querySelector("~");
JavaScript 上での取扱
対象のセレクタの invalid な文字をエスケープすれば良い。
正規表現で置き換えていくのもアリだが、正規表現の妥当性をチェックするのが大変である。
CSS.escape()
CSS.escape()
を利用する。
CSS.escape(".foo#bar") // "\.foo\#bar"
CSS.escape("()[]{}") // "\(\)\[\]\{\}"
CSS.escape('--a') // "--a"
CSS.escape(0) // "\30 ", the Unicode code point of '0' is 30
CSS.escape('\0') // "\ufffd", the Unicode REPLACEMENT CHARACTER
参考: CSS.escape() - Web APIs | MDN
引数にCSSOMString
を渡すと、エスケープ後のセレクタ文字列を返却してくれる。
ただしCSS
メソッドは、IE などのレガシーブラウザで使用できないので注意。
レガシーブラウザ対応が必要であれば、polyfillがオープンソースで提供されているので使うと良い。