>웹 프론트엔드 >JS 튜토리얼 >jQuery 소스코드 분석-03 jQuery 객체 구성하기-도구 function_jquery

jQuery 소스코드 분석-03 jQuery 객체 구성하기-도구 function_jquery

WBOY
WBOY원래의
2016-05-16 17:59:291131검색

작성자: nuysoft/Gao Yun QQ: 47214707 이메일: nuysoft@gmail.com
진술: 이 기사는 원본 기사입니다. 재인쇄해야 하는 경우 출처를 표시하고 원본 링크를 유지하세요.
읽고, 읽고, 쓰고, 잘못된 점이 있으면 말씀해 주세요. 이 장의 PDF는 이 장을 마치면 공개될 예정입니다.
jQuery 소스 코드 분석 시리즈의 디렉토리는 http://nuysoft.iteye.com/blog/1177451을 확인하세요. 체계적으로 작성하고 싶다면 관심 있는 부분부터 시작하겠습니다. 어떤 모듈이 궁금하신지 분석을 우선으로 하라고 추천해 주시면 같이 공부해보겠습니다.
3.4 기타 정적 도구 기능

코드 복사 코드는 다음과 같습니다.

// 유틸리티 함수 확장
jQuery.extend({
// $
의 jQuery 제어 해제// 많은 JavaScript 라이브러리는 $를 함수 또는 변수 이름으로 사용하며 jQuery도 동일합니다. .
// jQuery에서 $는 jQuery의 별칭이므로 $를 사용하지 않아도 모든 기능이 보장됩니다.
// jQuery 외에 다른 JavaScript 라이브러리를 사용해야 하는 경우 $를 호출할 수 있습니다. noConflect()는 라이브러리에 제어권을 반환합니다.
// 이 메소드에 true 매개변수를 전달하면 $ 및 jQuery에 대한 제어권을 다른 JavaScript 라이브러리에 반환할 수 있습니다. // $
if ( window.$ === jQuery ) {
window.$ = _$>}
// jQuery 제어 넘겨주기
if ( deep; && window.jQuery === jQuery ) {
window.jQuery =
}
return jQuery;
},
// DOM을 사용할 준비가 되었나요?
isReady: false,
// 준비 이벤트가 시작되기 전에 기다려야 할 항목 수를 추적하는 카운터
// #6781을 참조하세요.
// 추적하는 데 사용되는 카운터입니다. 준비 이벤트가 트리거되기 전에 대기할 횟수
readyWait: 1,
// 준비 이벤트 보류(또는 해제)
// 계속 기다리거나 트리거
holdReady : function( Hold ) {
if (hold ) {
jQuery.readyWait ;
} else {
jQuery.ready( true )
},
/ / DOM이 준비됨
// 문서가 로드될 때 처리
ready: function( wait ) {
// 보류 또는 DOMready/load 이벤트가 해제되었지만 아직 준비되지 않음
//
if ( (wait === true && !--jQuery.readyWait) || (wait !== true && !jQuery.isReady) ) {
// IE가 최소한 본문이 존재하는지 확인하세요. 약간 지나치게 열성적입니다(티켓 #5443).
// document.body가 있는지 확인하세요
if ( !document.body ) {
return setTimeout( jQuery.ready, 1 )
// DOM이 준비되었음을 기억하세요
jQuery.isReady = true
// 일반적인 DOM Ready 이벤트가 발생하면 감소하고 필요한 경우 기다립니다.
if ( wait !== true && - -jQuery.readyWait > 0 ) {
return;
}
// 바인딩된 함수가 있는 경우
readyList.resolveWith( document, [ jQuery ] )/ / 바인딩된 준비 이벤트 트리거
if ( jQuery.fn.trigger ) {
jQuery( document ).trigger( "ready" ).unbind( "ready" )
}
}
},
//readyList 이벤트 처리 함수 대기열 초기화
// 브라우저 간 이벤트 바인딩 차이와 호환 가능
bindReady: function() {
if ( ReadyList ) {
return ;
}
readyList = jQuery._Deferred();
//
// 브라우저 이벤트가 이미 발생한 후에 $(document).ready()가 호출되는 경우를 포착하세요. if ( document.readyState === "complete" ) {
// 스크립트가 준비를 지연할 수 있도록 비동기적으로 처리합니다.
return setTimeout( jQuery.ready, 1 )
}
/ / Mozilla, Opera 및 webkit nightlies는 현재 이 이벤트를 지원합니다
// 브라우저를 스니핑하는 대신 브라우저의 기능을 감지하여 호환 가능한 이벤트
if ( document.addEventListener ) {
// 편리한 이벤트 콜백 사용
// 더 빠른 로딩 이벤트 사용
document.addEventListener( "DOMContentLoaded", DOMContentLoaded, false )
// 항상 작동하는 window.onload 대체
/ / 창 등록. onload 콜백 함수
window.addEventListener( "load", jQuery.ready, false )
// IE 이벤트 모델을 사용하는 경우
} else if ( document.attachEvent ) {
// 보장 onload 전에 실행,
// 늦을 수 있지만 iframe에도 안전합니다.
// onload 전에 onreadystatechange가 트리거되는지 확인하세요. 이는 iframe에 대해 느리지만 안전할 수 있습니다.
document.attachEvent( "onreadystatechange" , DOMContentLoaded );
// 항상 작동하는 window.onload 대체
// window.onload 콜백 함수 등록
window.attachEvent( "onload", jQuery.ready )
// IE인 경우 프레임이 아님
//문서가 준비되었는지 계속 확인하세요
var toplevel = false
try {
toplevel = window.frameElement ==
} catch(e ) {}
if ( document.documentElement.doScroll && toplevel ) {
doScrollCheck()
}
}
},
// test/unit /core.js 참조 isFunction에 관한 자세한 내용은
// 버전 1.3부터 ​​경고
//와 같은 DOM 메서드는 지원되지 않습니다. (#2968)// 함수 여부
isFunction: function( obj) {
return jQuery.type(obj) === "function";
},
// 배열인지 여부
// 브라우저에 내장된 경우- Array.isArray를 구현하려면 브라우저 자체 구현을 사용하세요.
// 그렇지 않으면 개체를 문자열로 변환하여 "[object Array]"인지 확인하세요.
isArray: Array.isArray || function( obj ) {
return jQuery.type(obj) === "array";
},
// 객체인지 확인하는 대략적인 방법 창인지
// 간단한 판단(setInterval 속성 판단) 창 개체
isWindow: function( obj ) {
return obj && typeof obj === "object" && "setInterval" in obj ;
},
// 예약어 NaN인지 여부
isNaN: function( obj ) {
// null과 같거나 숫자가 아니거나 window.isNaN을 호출하여 판단
return obj == null | !rdigit.test( obj ) || isNaN( obj )
},
// 객체 유형 가져오기
function( obj ) {
/ / 핵심 API를 통해 개체를 생성합니다. 새 키워드가 필요하지 않습니다.
// 일반 기능은 작동하지 않습니다.
// Object.prototype.toString 메서드를 호출하여 "[object Xxx]" 형식의 문자열을 생성합니다.
// class2type[ "[object " name "]" ] = name.toLowerCase();
return obj == null
String( obj ) :
class2type[ toString.call(obj ) ] || "object";
} ,
// obj가 순수 객체("{}" 또는 "new Object"를 통해 생성된 객체)인지 확인하세요.
// console.info( $. isPlainObject( {} ) ); // true
// console.info( $.isPlainObject( '' ) ) // false
// console.info( $.isPlainObject( document.location ) ); // true
// console.info( $.isPlainObject( document ) ); // false
// console.info( $.isPlainObject( new Date() ) ) // false / console.info( $.isPlainObject( ) ); // false
// isPlainObject 분석 및 재구성 http://www.jb51.net/article/25047.htm
// jQuery.isPlainObject() 이해하기 http://www.cnblogs .com/phpmix/articles/1733599.html
isPlainObject: function( obj ) {
// 객체여야 합니다.
// IE 때문에 우리도 그래야 합니다. 생성자 속성이 있는지 확인하세요.
// DOM 노드와 창 개체도 통과하지 않는지 확인하세요.
// 개체여야 합니다.
// 불법 포인터 예외가 발생하므로 IE8에서 발생하면 생성자는 속성
//DOM 노드 및 창 개체를 확인해야 하며 false를 반환합니다.
// obj가 존재하지 않거나 개체 유형이 아니거나 DOM 노드 또는 widnow 개체입니다. 직접 false를 반환합니다. 🎜>// 다음 세 가지 가능한 상황을 테스트합니다.
// jQuery.type(obj) !== "object" 유형이 객체가 아니므로 무시하세요.
// obj.nodeType은 DOM 노드가 객체가 아니라고 생각합니다. 순수 객체
// jQuery.isWindow(obj)는 window가 순수 객체가 아니라고 생각합니다. Object
if ( !obj || jQuery.type(obj) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) {
return false;
}
// 소유하지 않은 생성자 속성은 Object여야 합니다.
// 테스트 생성자 속성
// 생성자 함수 생성자가 있습니다. 하지만 자체 속성은 아닙니다(즉, 프로토타입을 통해 상속됨).
if ( obj.constructor &&
!hasOwn.call(obj, "constructor") &&
!hasOwn.call(obj. constructor.prototype, "isPrototypeOf") ) {
return false;
}
// 속도를 높이기 위해 소유한 속성이 먼저 열거됩니다.
// 마지막 속성이 소유한 경우 모든 속성이 나열됩니다.
var key;
for ( key in obj ) {}
// key === 정의되지 않았으며 속성이 없으며 단순한 순수 객체로 간주됩니다
// .call( obj, key ) 속성 키가 비어 있지 않고 속성 키의 객체가 자체적입니다(즉, 프로토타입을 통해 상속되지 않음)
return key === undefine || hasOwn.call( obj, key );
},
// 객체가 비어 있는지 여부
isEmptyObject: function( obj ) {
for ( var name in obj ) {
return false; }
return true;
},
// 예외 발생
error: function( msg ) {
throw msg;
},
// JSON 구문 분석 >//parseJSON은 문자열을 JSON 객체로 변환합니다.
// 일반적으로 eval을 사용합니다. ParseJSON은 이 작업을 캡슐화하지만 eval은 최후의 수단으로 사용됩니다.
// 최신 JavaScript 표준에 JSON 직렬화 및 역직렬화 API가 추가되었기 때문입니다.
// 브라우저가 이 표준을 지원한다면 이 두 API는 Native Code를 사용하여 JS 엔진에 구현되며 효율성은 확실히 eval보다 훨씬 높습니다.
// 현재 Chrome과 Firefox4 모두 이 API를 지원합니다.
parseJSON: function( data ) {
if ( typeof data !== "string" || !data ) {
return null;
}
// 선행/후행 공백을 확인하세요. 제거됨(IE에서는 처리할 수 없음)
data = jQuery.trim( data )
// 먼저 기본 JSON 파서를 사용하여 구문 분석을 시도합니다.
// 기본 JSON API. 역직렬화는 JSON.stringify(object)
if ( window.JSON && window.JSON.parse ) {
return window.JSON.parse( data )
}
// 들어오는지 확인하세요. 데이터는 실제 JSON입니다
// http://json.org/json2.js에서 가져온 논리
// ... 대략적으로 문자열 유효성을 확인하세요
if ( rvalidchars.test( data.replace( rvalidescape , "@" )
.replace( rvalidtokens, "]" )
.replace( rvalidbraces, "")) ) {
return (new Function( "return " data ))
}
jQuery.error( "잘못된 JSON: " data );
},
// 브라우저 간 XML 구문 분석
// (xml 및 tmp가 내부적으로 사용됨)
// 구문 분석 XML 크로스 브라우저
//parseXML 함수도 주로 표준 API 및 IE의 패키지입니다.
//표준 API는 DOMParser 개체입니다.
// IE는 Microsoft.XMLDOM의 ActiveXObject 개체를 사용합니다.
parseXML: function( data , xml , tmp ) {
if ( window.DOMParser ) { // 표준 표준 XML 파서
tmp = new DOMParser()
xml = tmp.parseFromString( data , "text/xml" );
} else { // IE IE의 XML 파서
xml = new ActiveXObject( "Microsoft.XMLDOM" )
xml.async = "false"; .loadXML( 데이터 );
}
tmp = xml.documentElement;
if ( !tmp || !tmp.nodeName || tmp.nodeName === "parsererror" ) {
jQuery. error( "잘못된 XML: " 데이터 );
}
return xml;
},
// No-op 함수
noop: function() {},
// 글로벌 컨텍스트에서 스크립트를 평가합니다.
// Jim Driscoll의 조사 결과를 기반으로 한 해결 방법
// http://weblogs.java.net/blog/driscoll/archive/2009/09/08/eval- javascript- global-context
// globalEval 함수는 스크립트를 전역 컨텍스트(창)에 로드합니다.
// window.execScript는 IE에서 사용할 수 있습니다.
// 다른 브라우저에서는 eval을 사용해야 합니다.
// 전체 jQuery 코드는 전체 익명 함수이므로 현재 컨텍스트는 jQuery입니다. 컨텍스트를 window로 설정하려면 globalEval을 사용해야 합니다.
globalEval: function( data ) {
// 데이터가 비어 있지 않습니다
if ( data && rnotwhite.test( data ) ) {
// Internet Explorer에서 execScript를 사용합니다
// 우리는 Firefox
( window.execScript || function( data ) {
window[ "eval" ].call( window, data ) 에서 context가 jQuery가 아닌 window
//가 되도록 익명 함수를 사용합니다. ;
} )( data );
}
},
// 노드 이름이 동일한지 확인
nodeName: function( elem, name ) {
// 무시 case
return elem.nodeName && elem.nodeName.toUpperCase() === name.toUpperCase();
},
// args는 내부 용도로만 사용됩니다.
// 객체 또는 배열 탐색
각각: function( object, callback, args ) {
var name, i = 0,
length = object.length,
isObj = length === 정의되지 않음 || );
// 매개변수 args가 있는 경우 적용을 호출하고 컨텍스트는 현재 탐색된 객체로 설정되며 매개변수는 args입니다.
if ( args ) {
if ( isObj ) {
for ( 객체의 이름 ) {
if ( callback.apply( object[ name ], args ) === false ) {
break
}
}
} else {
for ( ; i if ( callback.apply( object[ i ], args ) === false ) {
break;
}
}
}
// 각 항목을 가장 일반적으로 사용하는 특별하고 빠른 사례
// 매개변수 인수가 없으면 호출이 호출되고 컨텍스트는 현재 탐색된 객체로 설정되고 매개변수는 키로 설정됩니다. /index 및 값
} else {
if ( isObj ) {
for ( name in object ) {
if ( callback.call( object[ name ], name, object[ name ] ) = == false ) {
break;
}
}
} else {
for ( ; i < length; ) {
if ( callback.call( object[ i ] , i, object[ i ] ) === false ) {
break;
}
}
}
}
return object; / 가능하면 기본 String.trim 함수를 사용하세요.
// 가능한 한 로컬 String.trim 메서드를 사용하세요. 그렇지 않으면 선행 공백을 먼저 필터링한 다음 후행 공백을 필터링합니다.
trim: Trim ? ( text ) {
return text == null ?
"" :
trim.call( text )
} :
// 그렇지 않으면 자체 트리밍 기능을 사용하세요
function( text ) {
return text == null ?
"" :
text.toString().replace( TrimLeft, "" ).replace( TrimRight, "" ),
// 결과는 내부용입니다.
// 의사 배열을 배열로 변환
makeArray: function( array, results ) {
var ret = results ||
if ( array ! = null ) {
// 창, 문자열(및 함수)에도 '길이'가 있습니다
// 추가 유형의 함수 검사는 충돌을 방지하기 위한 것입니다
// Safari 2(참조: #3039)
// Blackberry 4.7 RegExp 문제를 처리하기 위해 논리를 약간 조정했습니다. #6930
// 많은 브라우저 호환성 테스트, 정말 고통스럽습니다.
var type = jQuery.type( array )// 테스트: 길이 속성, 문자열, 함수, 정규
//는 배열도 아니고 의사 배열도 아닙니다.
if ( array.length == null
|| type === "string"
|| 유형 === "함수"
|| 유형 === "regexp"
|| jQuery.isWindow( array ) ) {
push.call( ret, array ); 🎜>} else {
// $.type ( $('div') ) // 객체
jQuery.merge( ret, array )
}
}
return ret;
},
//
inArray: function( elem, array ) {
// 현지화된 Array.prototype.indexOf가 있습니까
if ( indexOf ) {
// 직접 call Array.prototype.indexOf
return indexOf.call(array, elem);
}
// 배열을 탐색하여 정확히 동일한 요소가 있는지 찾아 아래 첨자를 반환합니다.
// 팁 루핑의 경우: array.length를 길이 변수에 저장하면 하나의 범위 검색을 줄일 수 있습니다.
for ( var i = 0, length = array.length; i < length; i ) {
if ( array[ i ] === elem ) {
return i;
}
}
// -1이 반환되면 배열에 없음을 의미합니다.
return -1; },
// 두 번째 배열을 첫 번째 배열로 병합
merge: function( first, second ) {
var i = first.length, //
j = 0
// If second의 길이 속성은 Number 유형이며, second를 배열로 처리합니다. j ) {
first[ i ] = second[ j ] ;
}
} else {
// 두 번째를 탐색하고 정의되지 않은 값을 첫 번째
에 추가 while ( second[ j] !== 정의되지 않음 ) {
first[ i ] = second[ j ];
}
}
// first의 길이 속성을 수정하세요. 왜냐하면 first는 실제 배열이 아닐 수 있기 때문입니다.
first.length = i;
return first;
},
// 배열을 필터링하고 새 배열을 반환합니다. 콜백이 true를 반환하면 유지됩니다. 콜백이 false를 반환하는 경우
grep: function( elems, callback, inv ) {
var ret = [], retVal;
inv = !!inv>// 저장만 수행
// 유효성 검사 함수를 전달하는 항목
// 배열을 탐색하고 통과한 항목만 저장합니다. 함수 콜백의 요소를 확인합니다
for ( var i = 0, length = elems.length; i < length; i ) {
// 여기서 콜백의 매개변수 목록은 각
retVal = !!callback( elems[ i ], i )의 습관과 일치하는 값, 인덱스입니다. ;
// 선택을 취소할지 여부
if ( inv !== retVal ) {
ret.push( elems[ i ] ) ;
}
}
return ret;
},
// arg는 내부 용도로만 사용됩니다.
// 배열 또는 객체 요소의 요소/속성을 새 배열로 변환합니다.
map: function( elems, callback, arg ) {
var value, key, ret = [],
i = 0,
length = elems.length,
// jquery 객체는 배열로 처리됩니다
// elems가 (의사) 배열인지 감지
// 1. jQuery 객체를 배열로 처리합니다
// 2. 길이 속성이 있는지, 길이가 0인지, 첫 번째 요소와 마지막 요소가 있는지, jQuery.isArray가 true를 반환하는지 확인합니다
isArray = jQuery의 요소 인스턴스
|| length !== 정의되지 않음 && typeof length === "number"
&& ( ( length > 0 && elems[ 0 ] && elems[ length -1 ] ) || length === 0 || jQuery.isArray( elems ) ) ;
// 배열인지 객체인지의 차이일 뿐이고 다른 점은 없습니다
// 배열, 각 항목을 해당
으로 변환// 배열을 탐색하고, 각 요소에 대한 콜백을 호출하고, null이 아닌 반환 값을 ret에 저장합니다.
if ( isArray ) {
for ( ; i < length; i ) {
// 콜백 실행, 매개변수는 value, index, arg 순서입니다.
value = callback( elems[ i ], i, arg )// null인 경우 반환, 무시(반환 없음 값 함수는 정의되지 않음을 반환함)
if ( value != null ) {
ret[ ret.length ] = value
}
}
// Go 객체의 모든 키를 통해
// 객체를 탐색하고, 각 속성에 대해 콜백을 호출하고, null이 아닌 반환 값을 ret에 저장합니다
} else {
for( key in elems ) {
// 콜백 실행, 매개변수는 value, key, arg 순서로
value = callback( elems[ key ], key, arg )
// 위와 동일
if ( value != null ) {
ret[ ret .length ] = value;
}
}
}
// 중첩 배열 평면화
// 중첩 배열 평면화
// concat:
// 항목이 배열인 경우 해당 내용을 끝에 추가합니다.
// 항목이 배열이 아닌 경우 배열 끝에 단일 배열 요소로 추가합니다.
return ret.concat.apply( [], ret );
},
// 객체에 대한 전역 GUID 카운터
guid: 1,
// 컨텍스트에 함수 바인딩 , 선택적으로
// 인수를 부분적으로 적용합니다.
// 프록시 메서드: fn에 대한 컨텍스트 지정(예: this)
// jQuery.proxy( function, context)
// jQuery.proxy( context, name )
proxy: function( fn, context ) {
// context가 문자열인 경우 context를 fn으로 설정하고 fn은 fn[ context ]
// 즉, fn의 context 메소드 컨텍스트는 fn입니다(이것이 기본값이 아닌가요???TODO)
if ( typeof context === "string" ) {
var tmp = fn[ context ]
context = fn
fn = tmp; / 사양에서 대상이 호출 가능한지 빠르게 확인합니다.
// TypeError가 발생하지만 정의되지 않은 상태가 반환됩니다.
// 사양에서 대상이 호출 가능한지 확인하는 빠른 확인입니다. , TypeError가 발생합니다.
// 하지만 여기서는 정의되지 않은 값만 반환합니다.
if ( !jQuery.isFunction( fn ) ) {
return undefine;
}
// 시뮬레이션된 바인딩
var args = 슬라이스.call( 인수, 2 ), // 매개변수 목록에서 fn,context 제거
proxy = function() {
// 컨텍스트를 컨텍스트 및 매개변수로 설정
return fn .apply ( context, args.concat( Slice.call( 인수 ) ) );
};
// 고유 핸들러의 guid를 원래 핸들러와 동일하게 설정하여 제거할 수 있습니다
/ / Unify 프록시를 제거할 수 있는 guid
proxy.guid = fn.guid = fn.guid || jQuery.guid ;
return Proxy
/ / 다기능 메서드 컬렉션에 값을 가져오고 설정하려면
// 값이 함수인 경우 선택적으로 실행될 수 있습니다.
// 다기능 함수, 컬렉션의 속성 값을 읽거나 설정합니다.
// fn: jQuery.fn.css, jQuery.fn.attr, jQuery.fn.prop
access: function( elems, key, value, exec, fn, pass ) {
var length = elems.length;
// 많은 속성 설정
// 여러 속성이 있는 경우 반복
if ( typeof key === "object" ) {
for ( var k in key ) {
jQuery.access( elems, k, key[k], exec, fn, value )
}
return elems;
}
// 하나의 속성 설정
// 하나의 속성만 설정
if ( value !== undefine ) {
// 선택적으로 exec가 true인 경우 함수 값이 실행됩니다.
exec = !pass && exec && jQuery.isFunction ( value);
for ( var i = 0; i fn( elems[i], key, exec ? value.call( elems[i], i, fn( elems [ i], key ) ) : value, pass );
}
return elems;
}
// 속성 가져오기
// 속성 읽기
반환 길이 ? elems[0], key ) : 정의되지 않음
},
// 현재 시간을 가져오는 편리한 함수
now: function() {
return (new Date()).getTime() ;
},
// jQuery.browser 사용은 눈살을 찌푸리게 합니다.
// 자세한 내용: http://docs.jquery.com/Utilities/jQuery.browser
// jQuery.browser는 더 이상 사용되지 않으므로 jQuery.support를 사용하는 것이 좋습니다.
// 사용 중인 브라우저에 대한 Navigator 정보
// Navigator.userAgent에서 사용하는 사용자 에이전트 헤더의 값을 선언하는 읽기 전용 문자열입니다. HTTP 요청용 브라우저
uaMatch: function( ua ) {
ua = ua.toLowerCase();
// 각 브라우저를 차례로 일치
var match = rwebkit.exec( ua ) || 🎜>ropera.exec( ua ) ||
rmsie.exec( ua ) ||
ua.indexOf("호환") < rmozilla.exec( ua ) ||
/ / match[1] || ""
// match[1]이 false인 경우(빈 문자열, null, 정의되지 않음, 0 등) 기본값은 ""입니다.
// match [2] || " 0"
// match[2]가 false인 경우(빈 문자열, null, 정의되지 않음, 0 등) 기본값은 "0"입니다.
return { 브라우저: match[1 ] || "", version: match[2] || "0" };
},
// jQuery의 새 복사본을 만듭니다. jQuery 객체는 영향을 받지 않습니다
// 두 가지 사용법이 있습니다:
// 1. 원래 메소드를 파괴하지 않고 jQuery 메소드를 대체합니다
// 2. 네임스페이스 충돌을 피하기 위해 캡슐화하고 jQuery를 개발하는 데 사용할 수 있습니다. 플러그인
// 주목할 만한 점은 jQuery.sub() 함수가 실제 격리를 제공하지 않는다는 것입니다. 모든 속성과 메소드는 여전히 원래 jQuery를 가리킵니다.
// 이 메소드를 사용하여 플러그인을 개발하는 경우 ins에서는 jQuery UI 위젯 프로젝트에 우선순위를 부여하는 것이 좋습니다
sub : function() {
function jQuerySub( selector, context ) {
return new jQuerySub.fn.init( selector, context );
}
jQuery.extend( true, jQuerySub, this ); // jQuery의 모든 속성과 메서드를 jQuerySub에 복사합니다.
jQuerySub.superclass =
jQuerySub.fn = jQuerySub. 프로토타입 = this(); //
jQuerySub.fn.constructor = jQuerySub;
jQuerySub.sub = this.sub;
jQuerySub.fn.init = function init( selector, context ) {
if ( context && context objectof jQuery && !(context instanceof jQuerySub) ) {
context = jQuerySub( context )
}
return jQuery.fn.init.call( this, selector, context, rootjQuerySub ) ;
};
jQuerySub.fn.init.fn;
var rootjQuerySub(document)
return jQuerySub; 및 버전:
// $.browser.msie/mozilla/ webkit/opera
// $.browser.version
// jQuery.browser 브라우저 유형을 스니핑하는 것은 권장되지 않지만 브라우저의 기능적 특징 jQuery.support
// 향후 jQuery.browser는 플러그인
브라우저: {}
})으로 이동될 예정입니다.
성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.