HTML.jsについて
HTML.jsというJavaScriptで楽にDOM操作を行えるようにするライブラリーがあります。結論から申しますと、このライブラリーは絶対に使うべきではないライブラリーとなっています。
この記事は執筆時点の最新バージョンであるHTML.js 0.9.3を元にして書いており、今後なんらかの変更がHTML.jsに加えられることによって、次に書く内容は陳腐化してしまう可能性はないわけではありません。ですが、ひとまづこの記事を執筆している時点では使うにあたって不都合ばかりが多く発生してしまう非常に邪悪なライブラリーです。
HTML.jsはMutationObserver
を使えるウェブブラウザーではMutationObserver
を用いて、MutationObserver
が使えない環境ではDOMSubtreeModified
イベントを用いてHTML文書の変更を検知しています。そしてHTML文書に変更のあったつどに任意の処理を発生させています。そしてその処理は変更が起きた要素の数だけ行われます。そのためにHTML文書の変更が頻繁に起きるようなウェブページの場合には動作が緩慢になってしまうおそれがあります。
また、それだけではなくHTML.jsは本番環境で使用するにあたって致命的なまでの仕様上の問題があります。任意の要素をHTML.jsの提供するAPIを用いて取得するとその取得した要素のDOMノードには本来存在し得ないメソッドやプロパティーを勝手に追加してしまいます。このような行為はJavaScriptの仕様上、できるようになっているものではありますが、既存のオブジェクトに、後に実行されたものが外部から変更を加えるような動作は、あまりにも行儀が悪い行為だというのがわたしの認識です。また行儀が悪いだけではなく、別の動作によってなにかしらの競合が発生してしまうおそれも同時に存在することとなります。あきらかな悪手をやってのけているのが、このHTML.jsというライブラリーになります。
先にも書いた通りにこの記事はHTML.js 0.9.3の内容を元に書いており、後に変更が加えられることによって健全化がなされる可能性は否定しません。ですがHTML.jsはDOMContentLoaded
やDOMSubtreeModified
イベント、HTMLElement.prototype.matchesSelector
メソッドが存在しなければまともな動作をしてくれないようになっています。それにより、FAQにもあるように、よほど新しいウェブブラウザーでしか動作しないようになっています。古いウェブブラウザーを無視できるのであれば、そもそもこのようにDOM操作の実行を代りに行ってくれるようなライブラリーは本来不要なのです。DOM操作の実行を代りに行ってもらう必要があるのは、古いIEのように他のウェブブラウザーと動作に違いが存在してしまうウェブブラウザーのためだけです。
古いウェブブラウザーを無視できるのであれば、このようなライブラリーを使うことによって得られるものは記述の簡素化だけです。ですが、得られるものが乏しいだけではなく、動作速度の低下を招いてしまったり、依存関係の発生による動作確認の手順が増えてしまうなどといった不都合が複数あります。それでもあなたはわざわざこのような邪悪なライブラリーを使い続けますか?