document.querySelectorAll()
브라우저간에 여러 불일치가 있으며 이전 브라우저에서는 지원 되지 않습니다 . 오늘날에는 더 이상 문제가 발생하지 않습니다 . 그것은 매우 직관적이지 않은 범위 지정 메커니즘 과 다른 좋은 기능이 없습니다 . 또한 자바 스크립트를 사용하면 이러한 쿼리의 결과 세트로 작업하는 데 어려움이 있습니다. : jQuery를 같은 그들에 작업하는 기능을 제공 filter()
, find()
, children()
, parent()
, map()
, not()
그리고 몇 가지 더. 의사 클래스 선택기와 함께 작동하는 jQuery 기능은 말할 것도 없습니다.
그러나 이러한 것들을 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로 작성하는 코드 라인의 최소 두 배입니다. 또한 기본 코드 의 심각한 속도 이점 (신뢰성 제외)을 손상시키는 브라우저 간 문제를 고려해야 합니다.
querySelector
메소드 에서 작동하지 않는 자체 선택기를 추가 합니다. (3) jQuery를 사용하면 AJAX 호출이 훨씬 빠르고 쉽습니다. (4) IE6 +에서의 지원. 나는 더 많은 포인트가있을 것이라고 확신합니다.