> 웹 프론트엔드 > JS 튜토리얼 > jQuery 객체 데이터 캐싱에 대하여 Cache 원리 및 jQuery.data 상세 설명_jquery

jQuery 객체 데이터 캐싱에 대하여 Cache 원리 및 jQuery.data 상세 설명_jquery

WBOY
풀어 주다: 2016-05-16 17:38:09
원래의
1251명이 탐색했습니다.

jQuery.data(..)를 사용하여 데이터 캐싱을 구현하는 방법에 대한 많은 온라인 튜토리얼이 있지만 사용자가 일반적으로 사용하는 두 가지가 있습니다: data([key],[value]) 및 jQuery.data(element, [키] , [값]) 둘의 차이점을 명확하게 설명하는 글이 거의 없어서 사용해보고 연구해서 여러분과 공유했습니다.
$("").data([key],[value])와 jQuery.data(element,[key],[value])의 차이점
두 함수 모두 요소에 사용됩니다. 데이터를 저장하는 것도 일반적으로 데이터 캐싱이라고 하며 둘 다 jQuery 객체를 반환합니다. 각각 사용했을 때 정말 충격을 받았습니다. 사실 알 필요는 없지만 사용했을 때 충격을 받았습니다. 먼저 예제를 살펴보고, 소스코드를 기반으로 분석해 보겠습니다.

JS 코드:

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

test2

test3

test

aaaa


<script>$(document).ready(function( ){ <br>$("#test").click(function(){ <br>alert("JQUERY"); <br><br>var e=$("div");//두 개의 jquery 객체 <br>var w=$("div");//e는 w와 동일하지 않습니다. <br><br>//처음에는 data([key],[value]) 사용법을 사용합니다. a","aaaa");//e와 w에 각각 키를 사용하여 동일한 데이터를 저장합니다. <br>$(w).data("a","wwww");// 덮어쓰는지 확인합니다. 이전 항목은 다른 개체에 저장되었지만 <br>alert($(e).data("a"));//답을 추측하셨나요? wwww <br>alert(e===w)//false <br>alert($(w).data("a"));//이것도 wwww입니다. <br><br>//jQuery.data 사용 (element,[key],[value]) 데이터를 저장합니다. <br>$.data(e,"b","cccc");//e와 w에 각각 동일한 데이터를 저장합니다. <br> $. data(w,"b","dddd");//다른 개체에 저장되어 있지만 이전 개체를 덮어쓰는지 확인하세요. <br>alert($.data(e,"b")); //답을 추측할 수 있어야 합니다. cccc <br>alert($.data(w,"b"));//이 출력 dddd <br><br>}) <br>}); <br></script>

위 예시를 읽어보니 data([key],[value])와 jQuery.data(element,[key],[value])가 근본적으로 다르다는 사실을 발견하셨나요? 그들 사이에 어떤 관계가 있습니까? data([key],[value])가 이전 키의 동일한 값을 덮어쓰는 이유는 무엇입니까?

그리고 jQuery.data(element,[key],[value])는 다른 객체에 바인딩되어 있는 한 덮어쓰기를 발생시키지 않습니다. 그렇습니까? 소스 코드를 연구해 봅시다. 먼저 jQuery.data(element,[key],[value]) 소스 코드를 살펴보세요.



JS 코드:

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

jQuery.extend({
cache: {},

// 주의해서 사용하세요.
uuid: 0,

// 각 복사본마다 고유합니다. 페이지의 jQuery
// rinlinejQuery와 일치하도록 숫자가 아닌 항목이 제거됨
expando: "jQuery" ( jQuery.fn.jquery Math.random() ).replace( /D/g, "" ),

....
data: function( elem, name, data, pvt /* Internal Use Only */ ) {
// 데이터를 추가할 수 있는지 여부, 그렇지 않은 경우 직접 반환
if ( !jQuery.acceptData( elem ) ) {
return;
}

var privateCache, thisCache, ret,
//jQuery.expando 이것은 다음과 같은 고유한 문자열입니다. jquery 객체는 생성 시 생성됩니다.
internalKey = jQuery.expando,
getByName = typeof name === "string",

// DOM 요소와 JS 객체는 별도로 처리해야 합니다. , IE6-7은 DOM 객체와 JS 객체 전체에서 객체 참조 속성을 가비지 수집할 수 없기 때문입니다
isNode = elem.nodeType,

// DOM 요소인 경우 전역 jQuery.cache를 사용하세요
// JS 객체인 경우 객체에 직접 연결
cache = isNode ? jQuery.cache : elem,

// 캐시가 이미 존재하는 경우에만 JS 객체에 대한 ID를 정의할 수 있습니다. 🎜 >// 캐시가 없는 DOM 노드와 동일한 경로에 있는 바로가기 코드
id = isNode ? elem[ InternalKey ] : elem[ InternalKey ] && InternalKey,
isEvents = name === "events" ;

// 데이터가 없는 개체에 대한 데이터를 가져오려고 할 때 불필요한 작업을 더 이상 수행하지 마세요.
// 개체에 데이터가 없으면 직접 반환합니다.
if ( (!id | | !cache[id] || (!isEvents && !pvt && !cache[id].data)) && getByName && data === 정의되지 않음 ) {
return
}
// id If 존재하지 않는 경우
if ( !id ) {
를 생성합니다. // DOM 노드의 데이터는
// 전역 캐시에 저장되기 때문에 각 요소에 대해 새로운 고유 ID가 필요합니다.
( isNode ) {
// DOM 요소인 경우 해당 요소에 고유한 ID를 생성하고 속성값으로 jQuery.expando
//를 사용하고 해당 ID를 elem 요소에 저장하여 사용할 수 있도록 합니다. 나중에 jQuery.expando ID를 기반으로 검색됩니다.
elem[ InternalKey ] = id = jQuery.uuid;
} else {
//JS 객체는 jQuery.expando를 직접 사용하는데, 왜 id가 필요한가요?
// 다른 속성과의 충돌을 피하세요!
id = InternalKey;
}
}

//// 키에 값이 포함되어 있는지 액세스하려고 할 때 jQuery.cache[id] 값이 존재하지 않으면
//JQuery.cache[id] 값을 빈 객체로 초기화 {}
if ( !cache[ id ] ) {
cache[ id ] = {};

if ( ! isNode ) {
cache[ id ].toJSON = jQuery.noop;
}
}

// 키/값 쌍 대신 객체를 jQuery.data에 전달할 수 있습니다. ; 이것은
// 기존 캐시에 얕은 복사를 가져옵니다
// 데이터는 객체와 함수를 수신하기 위한 것입니다. 얕은 복사
if ( typeof name === "object" || typeof name === "function " ) {
if ( pvt ) {
cache[ id ] = jQuery.extend( 캐시[ id ], name )
} else {
cache[ id ].data = jQuery .extend ( 캐시[ id ].data, name );
}
}
/ 모든 데이터를 저장하는 매핑 개체인 Storage 개체
privateCache = thisCache[ id ];
// jQuery data()는 내부 데이터와 사용자 정의
// 데이터 간의 키 충돌을 피하기 위해 객체의 내부 데이터
// 캐시 내부의 별도 객체에 저장됩니다. / jQuery 내부 데이터는 독립된 객체(thisCache.data==thisCache[internalKey])에 존재합니다
//On, 내부 데이터와 사용자 정의 데이터의 충돌을 피하기 위해
if ( !pvt ) {
// 비공개 저장 데이터 객체가 없으면 하나를 생성합니다. {}
if ( !thisCache.data ) {
thisCache.data = {}
}
// thisCache 교체 개인 데이터 객체
thisCache = thisCache.data
}
// 데이터가 정의되지 않은 경우 데이터 매개변수가 전달된 다음 데이터가 name 속성에 저장된다는 의미입니다. >if ( data !== undefine ) {
/ / jQuery.camelCase(name) 함수는 객체/함수가 전달되면 변환이 수행되지 않는다는 것입니다.
//전달된 이름만 수행됩니다. in은 문자열입니다. 따라서 최종적으로 저장되는 것은 키/값 쌍입니다.
thisCache[ jQuery.camelCase( name ) ] = data
}

//이제부터 다음 코드는 데이터를 처리합니다. (요소, 이름) 데이터가 비어 있으면 반환 값 데이터를 찾으세요.

if ( isEvents && !thisCache[ name ] ) {
return privateCache.events;
}

// name이 문자열인 경우 데이터 반환
/ / 그렇지 않은 경우 전체 저장소 개체를 반환합니다.
if ( getByName ) {

// 먼저 있는 그대로의 속성 데이터를 찾습니다.
ret = thisCache[ name ]

/ / null|정의되지 않은 속성 데이터 테스트
if ( ret == null ) {

// camelCased 속성 찾기
ret = thisCache[ jQuery.camelCase( name ) ]; >}
} else {
ret = thisCache
}

return
},
...........
});

사진을 참고해주세요.

jQuery.data(element,[key],[value]) 소스 코드를 보면 각 요소마다 데이터를 저장하기 위한 자체 {key:value} 개체가 있으므로 새로 생성된 개체가 동일한 키를 가집니다. 새 객체가 다른 {key:value} 객체에 저장되므로 원래 기존 객체 키에 해당하는 값을 덮어쓰지 않습니다.

다음으로 각각(콜백)을 사용하는 데이터([키],[값])의 소스 코드를 분석해야 합니다. 분석에 앞서 각각의 사용법과 소스 코드를 살펴보겠습니다. (콜백).

JS 코드:

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

test2

test3

test

aaaa


<script>$(document).ready(function( ){ <br>$("#test").click(function(){ <br>alert("JQUERY"); <br><br>var i=0; <br>$("#abc3") .each( function() { <br>alert( i);//1개만 출력합니다. <div id="abc3"> <br>}이 하나뿐이므로 <br>alert("-- --"); <br>var j=0; <br>$("div").each(function() { <br>alert( j);//각각 1, 2, 3을 출력합니다. three <div> 세 번 반복 <br>}) <br>}) <br></script> 이제 각 메소드의 구체적인 구현을 살펴보겠습니다. 다음과 같습니다:
jQuery.fn = jQuery.prototype = {
each: function( callback, args ) {
return jQuery.each( this, callback, args )
}
}

반환되는 것은 전역 Each 메소드이고 자체 jQuery 객체가 매개변수로 제공되는 것을 볼 수 있습니다. 전역 Each 메소드의 구체적인 구현은 다음과 같습니다.
// args는 다음과 같습니다. 내부 멤버에 대한 호출로 사용됨
each: function( object, callback, args ) {
var name, i = 0, length = object.length; // object가 jQuery 객체인 경우 길이는 비어 있지 않습니다.

if ( args ) {
if ( 길이 === 정의되지 않음 ) {
for ( 객체의 이름 )
if ( callback.apply( object[ name ], args ) == = false )
break;
} else
for ( ; i < length; )
if ( callback.apply( object[ i ], args ) === false )
break ;
// 다음은 호출할 클라이언트 프로그램입니다.
} else {
if ( length === undefine ) {
for ( name in object )
if ( callback.call( object[ name ], name, object[ name ] ) === false )
break
} else
// i는 인덱스 값을 나타내고, value는 DOM 요소를 나타냅니다.
for( var value = object[0];
i < length && callback.call( value, i, value ) !== false
value = object[ i] ){}
}

반환 객체
}



이제 우리는 ( var value = object[0]; i < length && callback.call( value, i, value ) !== false; value = object[ i] ){}; object[0]은 for 루프를 통해 jQuery 객체의 첫 번째 DOM 요소를 가져옵니다.
는 callback.call(value,i,value);을 통해 전체 jQuery 객체의 해당 DOM 요소를 순회합니다. 콜백 this 객체는 값 객체를 가리키며 두 개의 매개변수가 전달됩니다. i는 인덱스 값을 나타내고 value는 DOM 요소를 나타냅니다. 콜백은 function(index, elem) { }와 유사한 메서드입니다. 그래서 우리는 $("").each(function(index, elem){ });
데이터([키],[값])의 소스코드를 살펴보겠습니다

JS 코드:

코드 복사

코드는 다음과 같습니다.

jQuery.fn.extend({
data: function( key, value) {
var parts, part, attr, name, l,
elem = this[0],
i = 0,
data = null;

// 모든 값을 가져옵니다. ​​
if ( key === undefine ) {
.....//없이 처리 주요 상황, 이것은 우리가 논의할 내용이 아닙니다.

return data;
}

// 여러 값 설정 ​​
if ( typeof key === "object " ) {
return this.each(function() {
jQuery.data( this, key );
});
}

parts = key.split( " .", 2 );
parts[1] = parts[1] ? "." parts[1] : "";
part = parts[1] "!";

return jQuery.access( this, function( value ) {

if ( value === undefine ) {
. //값이 없을 때 반환값을 구하는 경우입니다. 우리가 논의하고 있는 내용이 아닙니다
} <.>
parts[1] = value

//$("div").data("a","aaa"를 사용하는 경우 )), 아래에서는 각각이 $("div"),
this.each(function() {//에 의해 반환된 객체이기 전에 this 포인터를 호출합니다. 참고, 여기서는 일치하는 각 요소를 컨텍스트로 사용하여 함수를 실행합니다.
var self = jQuery ( this );

self.triggerHandler( "setData" part, parts )

//여기서 데이터는 요소에 저장됩니다. 위임 데이터(요소,[키],[값 ]).
//이전 분석을 참조하세요.
//아래 data(this, key, value)에서 이는 전체에서 해당하는 각 DOM 요소를 순회하는 것을 의미합니다. jQuery 객체
//$("div") 페이지의
배열에 해당합니다.
jQuery.data( this, key, value );//이 문은 루프에서 여러 번 실행됩니다. 즉, 데이터가 저장됩니다.< ;/스팬>
//핵심 문장은 이렇습니다. 하지만 위에서는 각각(functipn(){})에 있다는 점을 분명히 확인하세요.
self.triggerHandler( "changeData" 부분,
})
}, null, value,args.length > 1, null, false ); //요소에 저장된 데이터를 제거합니다. 구체적인 구현은 다음과 같습니다.
removeData: function( key ) {
return this.each(function() {
jQuery.removeData( this, key );
}); }
})



데이터([키],[값]) 소스코드에 대해 잘 모르시는 분들을 위해 예제를 통해 따라해보겠습니다.
JS 코드:

코드 복사

test

aaaa


<script>$(document).ready(function( ){ <br>$("#test").click(function(){ <br>alert("JQUERY"); <br><br>var i=0; <br>$("#abc3") .each( function() { <br>alert( i);//1개만 출력합니다. <div id="abc3"> <br>}이 하나뿐이므로 <br>alert("-- --"); <br>var j=1; <br>$("div").each(function() {//각 일치 요소를 컨텍스트로 사용하여 이 함수를 실행합니다<br><br>$.data (this, "a","wwww");//여기서는 $("div")를 참조합니다. <br>//일치하는 각 요소를 개별적으로 탐색하고 각 개체에 대한 키/값을 저장합니다. {} <br>alert(j );//3개의 <div> 요소가 있으므로 각각 1, 2, 3을 출력합니다. <br>}) <br>alert($("#test").data("a")) ; //wwww로 돌아가기, <br>//아직 저장하지 않았는데, 이 div 노드에 값이 있는지 확인하는 것이 당연합니다. >//값이 있어야 합니다. 위 루프는 div의 Dom 노드에 저장되므로 <br>alert($("#test")===$("div"));//false는 증명합니다. 새로 생성된 두 개체가 동일하지 않습니다. <br><br>alert($("div").data("a"));//Return wwww, <br>//여기서도 마찬가지입니다. "a"="가 div 노드에 저장되어 있기 때문입니다. wwww" 이러한 키 값은 <br></script> >
이제 data([key],[value])와 jQuery.data(element,[key],[value])를 이해하셨을 것입니다. 그래도 이해가 되지 않는다면 다시 읽어보시고 인내심을 갖고 이해해 보세요. 한 번. 실제로 표면적으로는 매우 다르게 보입니다. 하지만 본질적으로 여전히 연관성이 있습니다. 이제 원리를 이해했으므로 안심하고 사용할 수 있습니다. jQuery.data(element,[key],[value])는 데이터를 매개변수 요소 노드에만 바인딩합니다. data([key],[value])
예를 들어 $("div").data("a","aaaa")는 div 노드와 일치하는 각 요소에 데이터를 바인딩합니다.
추가로 이 글의 분석에는
jquery-1.7.2.js
의 소스코드를 사용했습니다. 다운로드 주소:
http://demo.jb51.net/jslib/jquery/jquery-1.7.2.min.js


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