jquery 선택기 엔진 sizzle 분석

2614 단어
I'm sorry!내가 jquery를 사용한 지 약 1년이 되었는데, $(selector) 만 알고 있었고, 내부 선택기의 흐름이 전혀 명확하지 않았다.그래서 jquery의 원본 코드를 보았습니다. jquery가 사용하는 선택기의 엔진은sizzle이고 jquery의 저자의 또 다른 원본 프로젝트입니다. github에 가장 빠른dom 선택기라고 불리는 것이 있습니다!2천 줄 미만의 코드.
위에서 말한 것은 아주 흥미롭지 않은 오프닝입니다. 우리 for example: $('.test ') 는 jquery의 절차를 어떻게 갑니까?
1. 우선 다음과 같은 판단을 한다
 
  
/**
* querySelectorAll
*
*var nodelist = element.querySelectorAll("div.test");
* ie8+,Chrome,Firefox(3.5)
* google
*/
if ( document.querySelectorAll ) {
(function(){
var oldSizzle = Sizzle,
div = document.createElement("div"),
id = "__sizzle__";
div.innerHTML = "

";
// Safari can't handle uppercase or unicode characters when
// in quirks mode.
if ( div.querySelectorAll && div.querySelectorAll(".TEST").length === 0 ) {
return;
}
Sizzle = function( query, context, extra, seed ) {
// querySelectorAll
}
}


如果你的浏览器是ie8+ 或者 谷歌,直接通过内置的querySelectorAll(".test")返回dom结构。 如果你使用是ie6,那么下面事情发生了
2. 不支持querySelectorAll 就会启动内部 sizzle。下面是流程
 
  
/**
.sizzle
chunker = /((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|
)*)/g

. '.test', '.test'
. getElementsByClassName , dom, context.getElementsByTagName( "*" ) , , , className = 'test' , dom。
*/

ok, 이상은 $('.test ') 의 절차입니다. 만약 헷갈리면 원본 코드를 보고 디버깅을 할 수 있습니다.
sizzle 선택기 정보
개인적으로,sizzle 선택기는 증강판의querySelectorAll 함수라고 생각합니다.querySelectorAll은'div.test:eq(1)'같은selector와 css3 선택을 지원하지 않기 때문입니다!
selector에 nth|eq|gt|lt|first|last|even|odd 같은 문자가 나타나지 않을 때 오른쪽에서 왼쪽으로, 이른바 오른쪽에서 왼쪽으로, 예를 들어 $('div img')는 우선 모든img를 선택하고parent는div를 통해 필터를 합니다.이렇게 효율적인 이유는dom 조회를 한 번만 하는 것입니다!
selector에'eq(1)'라는 문자가 생겼을 때 정상이 됩니다. 왼쪽에서 오른쪽으로!결과 세트를 필터링해야 하기 때문입니다.
사색
$('div img:eq(0)')와 $('div img').first () 어느 효율이 높습니까?개인적으로는 뒤쪽이 좀 높다고 생각합니다. 왜냐하면 첫 번째는 왼쪽에서 오른쪽으로 효율이 낮기 때문입니다!테스트 안 해봤어!이론적 유도!
오늘은 대체적으로 절차를 보았지만, 구체적인 코드는 그다지 자세하게 연구하지 않았다!이 안의 좋은 사상은 배우고 흡수할 만하다
환영 벽돌

좋은 웹페이지 즐겨찾기