> 웹 프론트엔드 > JS 튜토리얼 > jQuery 소스코드 분석 참고사항 (6) jQuery.data_jquery

jQuery 소스코드 분석 참고사항 (6) jQuery.data_jquery

WBOY
풀어 주다: 2016-05-16 18:06:00
원래의
986명이 탐색했습니다.

데이터 부분의 코드는 1381행에서 시작됩니다. 코드의 처음 몇 줄 핵심:

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

jQuery .extend( {
// 데이터가 저장되는 장소, 핵심 구현 코어
cache: { },
// ID를 할당하는 데 사용되는 시드
uuid: 0,
/ / 서로 다른 jQuery 인스턴스를 구별하기 위해 저장된 데이터는 jQuery 버전 번호가 앞에 붙은 임의의 숫자를 Key
expando: "jQuery" (jQuery.fn.jquery Math.random()).replace(/D/g, " "),
// 다음 요소에는 데이터가 없습니다: embed 및 applet(아직 살아 있습니까?), Flash 이외의 개체.
noData: {
"embed": true,
" object": "clsid:D27CDB6E-.AE6D-11cf-96B8-444553540000",
"applet": true
}
});

외부 인터페이스는 두 가지를 호출합니다. 내부 함수: jQuery.data(elem, name, data, pvt) 및 jQuery.removeData(elem, name, pvt). RemoveData의 논리는 데이터가 추가된다는 점을 제외하면 데이터와 유사하지만, RemoveData는 삭제를 사용하거나 데이터를 삭제하기 위해 null로 설정됩니다.
데이터 섹션의 코드는 JS 객체와 DOM 객체의 저장을 명확하게 구분합니다. 이는 일부 브라우저의 메모리 누수 문제를 해결하기 위한 것입니다. 이전 버전의 IE에서는 DOM과 JS 개체 간에 순환 참조가 발생하면 GC가 이를 올바르게 처리할 수 없습니다. Internet Explorer 누출 패턴 이해 및 해결을 참조하세요. COM 개체의 경우 개체 요소에 데이터가 없도록 제한되어 있으므로 이 문제는 무시됩니다.
코드 복사 코드는 다음과 같습니다.

data: function(elem, name, data , pvt) {
// noData에 정의된 요소에 속하는 경우
if(!jQuery.acceptData(elem)) {
return
}
var InternalKey = jQuery.expando ,
getByName = typeof name === "string",
thisCache,
isNode = elem.nodeType,
// DOM 요소는 Cache에 저장되어야 하며 JS 객체는 Cache에 직접 저장됩니다. elem
cache = isNode ? jQuery .cache : elem,
// elem의 jQuery.expando에 이미 값이 있는 경우
id = isNode ? elem[jQuery.expando] && jQuery.expando;
// 데이터가 정의되지 않았습니다. 이는 현재 호출이 데이터를 쿼리하는 것이지만 객체에 데이터가 없음을 나타냅니다. , 그리고 직접 반환 
if((!id || (pvt && id && !cache[id][internalKey])) && getByName && data === undefine) {
return; >if(!id) {
if(isNode) {
// uuid 시드를 사용하여 고유 ID를 증분적으로 할당합니다. DOM 요소에만 필요합니다. 전역 캐시에 저장해야 하기 때문에
elem[jQuery.expando] = id = jQuery.uuid;
} else {
id = jQuery.expando;
}
// 원래 값 지우기
if(!cache[id]) {
cache[id] = {}
if(!isNode) {
cache[id].toJSON = jQuery.noop
}
}
// 확장을 사용하여 캐시를 확장하고 속성을 추가하여 데이터 저장
if(typeof name === "object" || typeof name === " function") {
if(pvt) {
cache[id][internalKey] = jQuery.expand(cache[id][internalKey], name);
} else {
cache[id ] = jQuery .extend(cache[id], name);
}
}
thisCache = cahce[id]
// 키 충돌 방지
if(pvt) {
if( !thisCache[internalKey]) {
thisCahce[internalKey] = {};
}
thisCache = thisCache[internalKey]
}
if(data !== 정의되지 않음) {
thisCache[jQuery.camelCase(name)] = data;
}
return getByName ? thisCache[jQuery.camelCase(name)] : thisCache: 함수( elem , name, pvt ) { // 앞 부분은 데이터와 유사합니다. // ... // 일부 브라우저는 Element에 대한 삭제 작업을 지원하지 않습니다. 이 브라우저 기능은 jQuery.support에서 확인하세요. // 삭제에 실패하면 먼저 null로 설정합니다. if ( jQuery.support.deleteExpando || 캐시 != window ) { 캐시 삭제[ id ] } else { 캐시[ id ] = null }
 ;CODE>var InternalCache = 캐시[ id ][ InternalKey ] 
// 데이터가 남아 있으면 지우고 다시 설정하여 성능을 높이세요.
if ( InternalCache ) {
cache[ id ] = {} ;
cache[ id ][ InternalKey ] = InternalCache;
// 더 이상 데이터가 없으면 모두 삭제
} else if ( isNode ) {
// 삭제가 지원되는 경우 , 삭제하세요.
// IE는 RemoveAttribute를 사용하므로 한번 시도해 보세요. 다시 실패하면 null로만 설정될 수 있습니다.
if ( jQuery.deleteExpando ) {
delete elem[ jQuery.expando ];
} else if ( elem.removeAttribute ) {
elem.removeAttribute( jQuery.expando )
} else {
elem[ jQuery.expando ] = null
}
}
}

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
최신 이슈
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿