jQuery 구조 함수 init 매개 변수 분석 (1)
9190 단어 jquery
init: function( selector, context, rootjQuery ) {
...
}
이 방법은 세 개의 매개 변수를 받아들이는 것을 볼 수 있는데, 그 앞의 두 개의 매개 변수는 jQuery 방법으로 전달된 것이다
var jQuery = function( selector, context ) {
// The jQuery object is actually just the init constructor 'enhanced'
return new jQuery.fn.init( selector, context, rootjQuery );
},
Selector는 원칙적으로 임의의 값을 입력할 수 있지만 모든 값이 의미가 있는 것은 아니다. undefined,DOM 요소, 문자열, 함수, jQuery 대상, 일반JavaScript 대상 등 몇 가지 유형만 유효하다. 이 매개 변수는 보통 기입하지만 쓰지 않아도 틀리지 않는다.
console.log($());
//[constructor: function, init: function, selector: "", jquery: "1.7.1", size: function…]
Context는 실행 상하문이나 실행 범위로 전송되지 않거나 DOM 요소, jQuery 대상, 일반 자바스크립트 대상 중 하나로 전송될 수 있습니다
파라미터 루트jQuery: 문서 대상을 포함하는 jQuery 대상입니다. 문서에 사용됩니다.getElementById () 검색에 실패했습니다. selector는 선택기 표현식이고 context가 지정되지 않았으며, selector가 함수인 경우 $(document) 입니다.
다음은 매개 변수에 따라 12가지 상황으로 나누어 하나씩 토론한다
1.selector는 false로 변환할 수 있습니다.
// Handle $(""), $(null), or $(undefined)
if ( !selector ) {
return this;
}
원본 코드의 주석은 이미 매우 명확하게 쓰여 있으며, 이 세 가지 상황일 때 직접적으로 Return은 어떠한 처리도 하지 않는다
2. 매개 변수 selector는 DOM 요소입니다.
예를 들어 $(document)이라는 쓰기
// Handle $(DOMElement)
if ( selector.nodeType ) {
this.context = this[0] = selector;
this.length = 1;
return this;
}
dom 요소라면 노드 형식이 있을 것입니다. 이 노드를 jquery 대상의 첫 번째 요소로 만들고 상하문context에 값을 부여합니다.length 속성은 jQuery의 원형 속성입니다. 기본값은 0입니다.
// The default length of a jQuery object is 0
length: 0,
여기에 원소가 하나 생기면length 속성을 1로 수정합니다.return this 작업은 함수를 실행한 후에도 jQuery 대상이 되도록 합니다. 그러면 $(document) 와 유사하게 실행할 수 있습니다.each () 라는 체인이 호출되었습니다.최종적으로 얻은 이와 같은 {0:document,context:document,length:1...}대상, 사실 모든 상황은 마지막에 이런 형식의 대상이 된다. jQuery의 원형 속성과 방법을 제외하고는 얻은dom 노드를 아라비아 숫자에 따라 순서대로 배열하기 때문에 우리는 $(selector)[0]의 형식으로 $(selector)를 대체할 수 있다.get(0)으로dom 대상을 가져옵니다.예를 들면 다음과 같습니다.
<!doctype html>
<html>
<head>
<title></title>
</head>
<body>
<div></div>
<div></div>
<div></div>
</body>
<script src='jquery-1.7.1.js'></script>
<script>
console.log($('div'));
/*[div, div, div, prevObject: jQuery.fn.jQuery.init[1], context: document, selector: "div", constructor: function, init: function…]
0: div
1: div
2: div
context: document
length: 3
prevObject: jQuery.fn.jQuery.init[1]__proto__: jQuery[0]
selector: "div"
.
*/
</script>
</html>
3. 매개 변수는 특수 문자열 "body"
바디 요소가 한 문서 대상에 하나밖에 없기 때문에 단독으로 열거하여 처리합니다
// The body element only exists once, optimize finding it
if ( selector === "body" && !context && document.body ) {
this.context = document;
this[0] = document.body;
this.selector = selector;
this.length = 1;
return this;
}
여기에 세 가지 조건이 동시에 충족되어야 하며, 두 번째는 상하문이 없어야 한다는 조건을 나도 잘 이해하지 못한다. $('body',document)와 같은 정상적으로 보이는 문법도 이런 상황에 의해 무시될 수 있다.
console.log($('body',document));
/*
jQuery.fn.jQuery.init[1]
0: body
context: document
length: 1
prevObject: jQuery.fn.jQuery.init[1]
selector: "body"
__proto__: jQuery[0]
*/
$('body') 의 결과와 같지만, 두 가지 상황으로 간주된다. 바디는 상하문이 하나밖에 없기 때문에 문서만 추가할 필요가 없기 때문일 수도 있고, 그렇지 않으면 상하문이 문서인지 아닌지를 판단해야 하기 때문이다.세 번째 조건은document을 확보하는 것이다.body가 반드시 존재해야 합니다. 그러면 어떤 상황에서 앞의 두 가지 상황이 문서를 만족시킬 수 있습니까?바디가 또 없는데?먼저 js 코드가 html 코드보다 먼저 불러올 때 이것은 초보자가 자주 범하는 오류입니다. 보통 우리는 다음과 같이 써야 합니다.
$(function(){...})
혹은
$(document).ready(function(){...})
사실 이 두 가지는 같은 추출의 방법이고dom는 이 부분을 불러온 후에 분석합니다.이에 대해 우리는 html 코드를 다음과 같이 테스트할 수 있다.
<!doctype html>
<html>
<head>
<title></title>
<script src='jquery-1.7.1.js'></script>
<script>
$('body')
</script>
</head>
<body>
<div></div>
<div></div>
<div></div>
</body>
</html>
그리고 jQuery 소스 코드에서 selector, context,document을 출력합니다.body
console.log(selector+context+document.body);
// The body element only exists once, optimize finding it
if ( selector === "body" && !context && document.body ) {
this.context = document;
this[0] = document.body;
this.selector = selector;
this.length = 1;
return this;
}
비록 우리는 하나만 썼지만 사실은 네 번을 집행했다. 마지막 한 번이야말로 우리가 호출한 결과이다. 마지막 결과는 바디언더 finednull이다. 이때 앞의 두 개는 만족하지만 마지막은null이다.첫 번째 jQuery 전체 구조 구조에서undefined가 다시 시작되면 문서입니다.바디가 null로 다시 쓰여지지 않을까요?내가 코드에서 수정을 시도할 때 오류를 보고하는 것은 불가능한 것 같다. 그러면 이 조건은 html을 불러오지 않고 실행하는 상황을 예방하는 것이다.
네 번째는 상술한 문자열 상황을 제외한 다른 문자열로 상황은 다음 편에 많이 두도록 하겠습니다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
jQuery 전후 예이 기사에서는 jquery after() 및 before() 메소드의 예를 볼 것입니다. before() 메서드는 선택한 요소 앞에 지정된 콘텐츠를 삽입합니다. after() 메서드는 선택한 요소 뒤에 지정된 콘텐츠...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.