document.querySelectorAll()
ブラウザ間でいくつかの不整合があり、古いブラウザではサポートされていません。これにより、最近は問題が発生しない可能性があります。それは非常に直感的でないスコーピングメカニズムと他のいくつかのあまり良くない機能を持っています。また、javascriptを使用すると、これらのクエリの結果セットを操作するのに苦労します。多くの場合、これを実行することをお勧めします。jQueryは、、、、、、、などfilter()
の関数を提供find()
します。疑似クラスセレクターと連携するjQuery機能は言うまでもありません。children()
parent()
map()
not()
ただし、これらの機能をjQueryの最も強力な機能とは見なしませんが、クロスブラウザー互換の方法またはajaxインターフェイスでのDOM(イベント、スタイリング、アニメーション、操作)の「作業」などの他の機能と見なします。
jQueryのセレクターエンジンのみが必要な場合は、jQuery自体が使用しているものを使用できます。Sizzleこのようにして、厄介なオーバーヘッドなしでjQuerysセレクターエンジンのパワーを利用できます。
編集:記録のために、私はバニラJavaScriptの大ファンです。それでも、1行のjQueryを作成する場合に10行のJavaScriptが必要になることがあるのは事実です。
もちろん、次のようにjQueryを記述しないように訓練する必要があります。
$('ul.first').find('.foo').css('background-color', 'red').end().find('.bar').css('background-color', 'green').end();
これは非常に読みにくいですが、後者はかなり明確です。
$('ul.first')
.find('.foo')
.css('background-color', 'red')
.end()
.find('.bar')
.css('background-color', 'green')
.end();
同等のJavaScriptは、上記の擬似コードで示されているように、はるかに複雑になります。
1)要素を見つけ、すべての要素または最初の要素のみを取ることを検討します。
// $('ul.first')
// taking querySelectorAll has to be considered
var e = document.querySelector("ul.first");
2)いくつかの(ネストされているか再帰的な)ループを介して子ノードの配列を反復処理し、クラスを確認します(クラスリストはすべてのブラウザーで使用できるわけではありません!)
//.find('.foo')
for (var i = 0;i<e.length;i++){
// older browser don't have element.classList -> even more complex
e[i].children.classList.contains('foo');
// do some more magic stuff here
}
3)cssスタイルを適用します
// .css('background-color', 'green')
// note different notation
element.style.backgroundColor = "green" // or
element.style["background-color"] = "green"
このコードは、jQueryで記述したコードの少なくとも2倍の行になります。また、ネイティブコードの(信頼性に加えて)深刻な速度の利点を損なうクロスブラウザの問題を考慮する必要があります。