jQuery의 데이터 연산 방법과 jQuery의 정의
이 글은 jQuery의 데이터 연산 방법과 jQuery의 정의를 소개합니다. 도움이 필요한 친구들이 참고할 수 있기를 바랍니다.
jQuery에는 데이터 작업을 위한 두 가지 방법이 있습니다
$().data() $.data(elem);
내부 구현은 사용자 정의 클래스 Data
Data
内部类 Data
Data
在src/data/Data.js
定义,构建时为实例添加expando
属性,作为唯一标识
function Data() { this.expando = jQuery.expando + Data.uid++; }
在原型上添加了多个方法
Data.prototype = { cache: function(){ ... }, set: function(){ ... }, get: function(){ ... }, access: function(){ ... }, remove: function(){ ... }, hasData: function(){ ... } }
在jq内部,使用cache方法获取缓存的数据。传入一个参数owner,表示要获取缓存数据的对象。判断在owner上是否有expando属性,如果没有,说明这个owner是否第一次调用,需要在其初始化缓存数据对象。判断节点的类型,如果是元素节点或者document节点或者对象时,可以设置缓存数据。如果是元素节点或者document节点,直接使用对象字面量进行赋值,属性名是expando,值为空对象。如果是对象的话,使用Object.defineProperty
为其定义数据,属性名也是expando,初始化为{},同时属性描述符可以更改,不可枚举。
Data.prototype.cache
cache: function( owner ) { // Check if the owner object already has a cache // 获取在owner的缓存值 var value = owner[ this.expando ]; // If not, create one if ( !value ) { value = {}; // We can accept data for non-element nodes in modern browsers, // but we should not, see #8335. // Always return an empty object. // 判断owener类型 是否能在其上调用data // 在元素节点或body或对象上可以设置data // 其他节点不设置缓存数据 if ( acceptData( owner ) ) { // If it is a node unlikely to be stringify-ed or looped over // use plain assignment // 此处为owner添加属性 key为Data对象的expando值 建立owner和Data对象之间的连接 // owner是元素节点或body if ( owner.nodeType ) { owner[ this.expando ] = value; // Otherwise secure it in a non-enumerable property // configurable must be true to allow the property to be // deleted when data is removed // owner是对象 // 为owner添加expando属性 初始化为{},同时属性描述符可以更改,不可枚举 } else { Object.defineProperty( owner, this.expando, { value: value, configurable: true } ); } } } return value; }
使用set
来更新缓存对象,分为data(key,value)
或data(obj)
两种调用情况,保存时要将键名保存为驼峰命名法。
Data.prototype.set
set: function( owner, data, value ) { var prop, cache = this.cache( owner ); // Handle: [ owner, key, value ] args // Always use camelCase key (gh-2257) if ( typeof data === "string" ) { cache[ jQuery.camelCase( data ) ] = value; // Handle: [ owner, { properties } ] args } else { // Copy the properties one-by-one to the cache object for ( prop in data ) { cache[ jQuery.camelCase( prop ) ] = data[ prop ]; } } return cache; }
使用get
来获取缓存对象,调用时有data(key)
和data()
。未指定key时直接返回整个cache对象,否则返回cache[key]。键名也要转为驼峰命名。
Data.prototype.get
get: function( owner, key ) { return key === undefined ? this.cache( owner ) : // Always use camelCase key (gh-2257) owner[ this.expando ] && owner[ this.expando ][ jQuery.camelCase( key ) ]; }
对调用的方式进行区分,内部调用 set
或get
通过参数的数量和类型进行区分:
key为空时,获取整个cache对象
key类型为
string
且value===undefined
对应获取指定值其他调用均为
set
,在set
内部进行区分
Data.prototype.access
access: function( owner, key, value ) { // In cases where either: // // 1. No key was specified // 2. A string key was specified, but no value provided // // Take the "read" path and allow the get method to determine // which value to return, respectively either: // // 1. The entire cache object // 2. The data stored at the key // if ( key === undefined || ( ( key && typeof key === "string" ) && value === undefined ) ) { return this.get( owner, key ); } // When the key is not a string, or both a key and value // are specified, set or extend (existing objects) with either: // // 1. An object of properties // 2. A key and value // this.set( owner, key, value ); // Since the "set" path can have two possible entry points // return the expected data based on which path was taken[*] return value !== undefined ? value : key; }
使用remove
来删除缓存对象属性,调用时,可以传入一个string,表示要删除的键名,或者传入一个保存多个键名的string数组。键名也要转为驼峰命名。如果不传入出参数,则直接删除掉在owner上的缓存数据对象。
Data.prototype.remove
remove: function( owner, key ) { var i, cache = owner[ this.expando ]; if ( cache === undefined ) { return; } if ( key !== undefined ) { // Support array or space separated string of keys if ( Array.isArray( key ) ) { // If key is an array of keys... // We always set camelCase keys, so remove that. key = key.map( jQuery.camelCase ); } else { key = jQuery.camelCase( key ); // If a key with the spaces exists, use it. // Otherwise, create an array by matching non-whitespace key = key in cache ? [ key ] : ( key.match( rnothtmlwhite ) || [] ); } i = key.length; while ( i-- ) { delete cache[ key[ i ] ]; } } // Remove the expando if there's no more data if ( key === undefined || jQuery.isEmptyObject( cache ) ) { // Support: Chrome <=35 - 45 // Webkit & Blink performance suffers when deleting properties // from DOM nodes, so set to undefined instead // https://bugs.chromium.org/p/chromium/issues/detail?id=378607 (bug restricted) if ( owner.nodeType ) { owner[ this.expando ] = undefined; } else { delete owner[ this.expando ]; } } }
判断owner上是否有缓存数据。
Data.prototype.hasData
hasData: function( owner ) { var cache = owner[ this.expando ]; return cache !== undefined && !jQuery.isEmptyObject( cache ); }
jQuery方法的定义
定义后内部类data
后,在/src/data.js
进行拓展。在jQuery添加了hasData
、data
、 removeData
、_data
、_removeData
等方法,在jQuery.fn上添加了data
和removeData
方法。
在jQuery拓展的方法,都是对Data方法的封装,在调用时$.data()
时,并无对set
和get
操作区分,在Data.prototype.access
内部区分set和get。下面源码中,dataUser
和dataPriv
是Data
实例,分别为缓存数据和表示jq对象是否将元素的data属性添加到dataUser
中
// $.data jQuery.extend( { hasData: function( elem ) { return dataUser.hasData( elem ) || dataPriv.hasData( elem ); }, data: function( elem, name, data ) { return dataUser.access( elem, name, data ); }, removeData: function( elem, name ) { dataUser.remove( elem, name ); }, // TODO: Now that all calls to _data and _removeData have been replaced // with direct calls to dataPriv methods, these can be deprecated. _data: function( elem, name, data ) { return dataPriv.access( elem, name, data ); }, _removeData: function( elem, name ) { dataPriv.remove( elem, name ); } } );
在jQuery.fn
上拓展的方法只有data
和removeData
。在data
内,先对$().data()
和$().data({k:v})
两个调用情况进行处理。如果是第一种情况,则返回在this[0]
上的缓存数据对象,如果是第一次以$().data()
的方式调用,同时还会将元素上的data属性添加dataUser
中,并更新dataPriv
。如果是$().data({k:v})
的调用方式,则遍历jq对象,为每个节点更新缓存数据。其他调用方式如$().data(k)
和$().data(k,v)
则调用access
进行处理。此处的access
并非Data.prototype.access
。
removeData
则遍历jq对象,删除在每个节点上的缓存数据。
// $().data jQuery.fn.extend( { data: function( key, value ) { var i, name, data, elem = this[ 0 ], // elem为dom对象 attrs = elem && elem.attributes; // 节点上的属性 // Gets all values // $().data() if ( key === undefined ) { if ( this.length ) { data = dataUser.get( elem ); // elem是元素节点,且dataPriv中无hasDataAttrs时执行这个代码块里的代码 // dataPriv上的hasDataAttrs表示elem是否有data-xxx属性 // 初始化dataPriv后花括号内的代码不再执行,即以下的if内的代码只执行一次 if ( elem.nodeType === 1 && !dataPriv.get( elem, "hasDataAttrs" ) ) { i = attrs.length; while ( i-- ) { // Support: IE 11 only // The attrs elements can be null (#14894) // 将elem的data-*-*属性以*-*转为驼峰命名方式的值为键 // 在dataAttr函数内保存到dataUser中 // 所以用$().data可以获取元素的data-*属性 但修改后dom上的属性却不变化 if ( attrs[ i ] ) { name = attrs[ i ].name; // name为data-xxx if ( name.indexOf( "data-" ) === 0 ) { // name为xxx name = jQuery.camelCase( name.slice( 5 ) ); dataAttr( elem, name, data[ name ] ); } } } // 同时将dataPriv的hasDataAttrs属性设置为真,表示已经将元素属性节点上的data属性保存到缓存对象中 dataPriv.set( elem, "hasDataAttrs", true ); } } return data; } // Sets multiple values // $().data(obj) 此处遍历this,即遍历jq对象上所有的节点,并在其设置值 if ( typeof key === "object" ) { return this.each( function() { dataUser.set( this, key ); } ); } // 除了$().data()和$().data({k:v})的其他情况 return access( this, function( value ) { var data; // The calling jQuery object (element matches) is not empty // (and therefore has an element appears at this[ 0 ]) and the // `value` parameter was not undefined. An empty jQuery object // will result in `undefined` for elem = this[ 0 ] which will // throw an exception if an attempt to read a data cache is made. // value undefined说明是获取操作 // 调用$().data(k) if ( elem && value === undefined ) { // Attempt to get data from the cache // The key will always be camelCased in Data // 从dataUser中获取 非undefined时返回 data = dataUser.get( elem, key ); if ( data !== undefined ) { return data; } // Attempt to "discover" the data in // HTML5 custom data-* attrs // dataUser中不存在key,调用dataAttr查找元素的data-*属性 // 如果存在属性,更新dataUser并返回其值 data = dataAttr( elem, key ); if ( data !== undefined ) { return data; } // We tried really hard, but the data doesn't exist. return; } // Set the data... // jq对象长度 >= 1, 调用如$().data(k,v) 遍历jq对象,为每个节点设置缓存数据 this.each( function() { // We always store the camelCased key dataUser.set( this, key, value ); } ); }, null, value, arguments.length > 1, null, true ); }, // 遍历jq对象,删除各个元素上的缓存数据 removeData: function( key ) { return this.each( function() { dataUser.remove( this, key ); } ); } } );
其中,getData
用于对元素上的data属性进行类型转换,dataAttr
用于获取保存在元素节点上的data属性,并同时更新dataUser
。需要注意的是,以$().data(k, v)
方式调用时,如果在缓存数据上查找不到属性,则会调用dataAttr
내부 클래스 Data
와 분리될 수 없습니다. Data
는 src/data/Data.js
에 정의되어 있습니다. 빌드할 때 인스턴스에 expando
속성을 고유 식별자
// 属性值是string 进行类型转换 function getData( data ) { if ( data === "true" ) { return true; } if ( data === "false" ) { return false; } if ( data === "null" ) { return null; } // Only convert to a number if it doesn't change the string // data转化成number再转成string后仍严格等于data if ( data === +data + "" ) { return +data; } if ( rbrace.test( data ) ) { return JSON.parse( data ); } return data; } // 获取元素的dataset中的属性,并保存到dataUser中 function dataAttr( elem, key, data ) { var name; // If nothing was found internally, try to fetch any // data from the HTML5 data-* attribute // 此处获取dataset里的值 if ( data === undefined && elem.nodeType === 1 ) { name = "data-" + key.replace( rmultiDash, "-$&" ).toLowerCase(); // 此处将驼峰命名方式的key转化为data-*-* data = elem.getAttribute( name ); if ( typeof data === "string" ) { try { data = getData( data ); } catch ( e ) {} // Make sure we set the data so it isn't changed later // 将元素的data-*属性保存到dataUser中 dataUser.set( elem, key, data ); } else { data = undefined; } } return data; }
Data.prototype.cache
rrreeeset
를 사용하여 data(key, value)
로 나누어진 캐시 개체를 업데이트합니다. > 또는 data(obj)
두 호출 케이스 모두 저장 시 키 이름을 카멜 케이스로 저장해야 합니다. 🎜Data.prototype.set
rrreee🎜get
을 사용하여 캐시 개체를 가져옵니다. 호출 시 data(key) 및 <code>data()
. 키를 지정하지 않으면 전체 캐시 객체가 직접 반환되고, 그렇지 않으면 캐시[키]가 반환됩니다. 키 이름도 카멜 표기법으로 변환해야 합니다. 🎜Data.prototype.get
rrreee🎜 호출 방법을 구별하고, 내부적으로 set
또는 get
를 호출합니다.🎜🎜 구별 매개변수의 수와 유형: 🎜- 🎜key가 비어 있으면 전체 캐시 객체를 가져옵니다. 🎜
- 🎜key 유형은
문자열입니다.
및value===undefine
은 지정된 값을 얻는 데 해당합니다🎜 - 🎜다른 호출은
set
,set 내부 구별🎜
Data.prototype.access
rrreee🎜캐시된 객체 속성을 삭제하려면 remove
를 사용하세요. 호출할 때 삭제할 키 이름을 나타내는 문자열을 전달하거나 여러 키 이름을 보유하는 문자열 배열을 전달할 수 있습니다. 키 이름도 카멜 표기법으로 변환해야 합니다. 매개변수가 전달되거나 전달되지 않으면 소유자의 캐시된 데이터 개체가 직접 삭제됩니다. 🎜Data.prototype.remove
rrreee🎜 소유자에 캐시된 데이터가 있는지 확인합니다. 🎜Data.prototype.hasData
rrreee🎜jQuery 메서드 정의🎜🎜내부 클래스 data
를 정의한 후 /src/data.js
가 확장됩니다. hasData
, data
, removeData
, _data
, _removeData
및 기타 메서드를 jQuery에 추가했습니다. , jQuery.fn에 data
및 removeData
메서드를 추가했습니다. 🎜🎜jQuery에서 확장된 메서드는 모두 Data 메서드를 캡슐화한 것입니다. $.data()
호출 시 set
및 get을 지원하지 않습니다. code>작업 구별, 세트 구별 및 <code>Data.prototype.access
내부 가져오기. 아래 소스 코드에서 dataUser
및 dataPriv
는 각각 데이터를 캐시하고 jq 객체가 요소의 데이터 속성을 추가하는지 여부를 나타내는 Data
의 인스턴스입니다. jQuery.fn
의 >dataUser에서 🎜rrreee🎜에 의해 확장된 유일한 메서드는 data
및 removeData
입니다. data
에서 먼저 $().data()
및 $().data({k:v})
라는 두 가지 호출을 수행합니다. 상황이 처리됩니다. 첫 번째 경우에는 $().data()this[0]
에 캐시된 데이터 객체가 반환됩니다. /code>, 요소의 데이터 속성을 dataUser
에 추가하고 dataPriv
를 업데이트합니다. $().data({k:v})
의 호출 메소드인 경우 jq 객체를 순회하며 각 노드마다 캐시된 데이터가 업데이트됩니다. $().data(k)
및 $().data(k,v)
와 같은 다른 호출 메서드는 처리를 위해 access
를 호출합니다. 여기서 access
는 Data.prototype.access
가 아닙니다. 🎜🎜removeData
는 jq 객체를 순회하고 각 노드에서 캐시된 데이터를 삭제합니다. 🎜rrreee🎜그 중 getData
는 요소의 데이터 속성에 대한 유형 변환을 수행하는 데 사용되고 dataAttr
는 요소 노드에 저장된 데이터 속성을 가져오고 dataUser
업데이트하세요. $().data(k, v)
메서드를 호출할 때 캐시된 데이터에서 속성을 찾을 수 없으면 dataAttr
가 호출된다는 점에 유의하세요. 요소에서 속성을 찾습니다. 🎜rrreee🎜추천 관련 기사: 🎜🎜🎜Angular 형식 유효성 검사의 두 가지 방법 소개🎜🎜JavaScript 함수를 사용하는 방법 JavaScript 함수의 속성과 메서드 소개
위 내용은 jQuery의 데이터 연산 방법과 jQuery의 정의의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

Video Face Swap
완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제











jQuery 참조 방법에 대한 자세한 설명: 빠른 시작 가이드 jQuery는 웹 사이트 개발에 널리 사용되는 JavaScript 라이브러리로, JavaScript 프로그래밍을 단순화하고 개발자에게 풍부한 기능을 제공합니다. 이 기사에서는 jQuery의 참조 방법을 자세히 소개하고 독자가 빠르게 시작할 수 있도록 구체적인 코드 예제를 제공합니다. jQuery 소개 먼저 HTML 파일에 jQuery 라이브러리를 도입해야 합니다. CDN 링크를 통해 소개하거나 다운로드할 수 있습니다.

jQuery에서 PUT 요청 방법을 사용하는 방법은 무엇입니까? jQuery에서 PUT 요청을 보내는 방법은 다른 유형의 요청을 보내는 것과 유사하지만 몇 가지 세부 사항과 매개 변수 설정에 주의해야 합니다. PUT 요청은 일반적으로 데이터베이스의 데이터 업데이트 또는 서버의 파일 업데이트와 같은 리소스를 업데이트하는 데 사용됩니다. 다음은 jQuery에서 PUT 요청 메소드를 사용하는 구체적인 코드 예제입니다. 먼저 jQuery 라이브러리 파일을 포함했는지 확인한 다음 $.ajax({u를 통해 PUT 요청을 보낼 수 있습니다.

jQuery를 사용하여 요소의 높이 속성을 제거하는 방법은 무엇입니까? 프런트엔드 개발에서는 요소의 높이 속성을 조작해야 하는 경우가 종종 있습니다. 때로는 요소의 높이를 동적으로 변경해야 할 수도 있고 요소의 높이 속성을 제거해야 하는 경우도 있습니다. 이 기사에서는 jQuery를 사용하여 요소의 높이 속성을 제거하는 방법을 소개하고 구체적인 코드 예제를 제공합니다. jQuery를 사용하여 높이 속성을 연산하기 전에 먼저 CSS의 높이 속성을 이해해야 합니다. height 속성은 요소의 높이를 설정하는 데 사용됩니다.

제목: jQuery 팁: 페이지에 있는 모든 태그의 텍스트를 빠르게 수정하세요. 웹 개발에서는 페이지의 요소를 수정하고 조작해야 하는 경우가 많습니다. jQuery를 사용할 때 페이지에 있는 모든 태그의 텍스트 내용을 한 번에 수정해야 하는 경우가 있는데, 이는 시간과 에너지를 절약할 수 있습니다. 다음은 jQuery를 사용하여 페이지의 모든 태그 텍스트를 빠르게 수정하는 방법을 소개하고 구체적인 코드 예제를 제공합니다. 먼저 jQuery 라이브러리 파일을 도입하고 다음 코드가 페이지에 도입되었는지 확인해야 합니다. <

제목: jQuery를 사용하여 모든 태그의 텍스트 내용을 수정합니다. jQuery는 DOM 작업을 처리하는 데 널리 사용되는 인기 있는 JavaScript 라이브러리입니다. 웹 개발을 하다 보면 페이지에 있는 링크 태그(태그)의 텍스트 내용을 수정해야 하는 경우가 종종 있습니다. 이 기사에서는 jQuery를 사용하여 이 목표를 달성하는 방법을 설명하고 구체적인 코드 예제를 제공합니다. 먼저 페이지에 jQuery 라이브러리를 도입해야 합니다. HTML 파일에 다음 코드를 추가합니다.

jQuery 요소에 특정 속성이 있는지 어떻게 알 수 있나요? jQuery를 사용하여 DOM 요소를 조작할 때 요소에 특정 속성이 있는지 확인해야 하는 상황이 자주 발생합니다. 이 경우 jQuery에서 제공하는 메소드를 사용하여 이 기능을 쉽게 구현할 수 있습니다. 다음은 jQuery 요소에 특정 속성이 있는지 확인하기 위해 일반적으로 사용되는 두 가지 방법을 특정 코드 예제와 함께 소개합니다. 방법 1: attr() 메서드와 typeof 연산자를 // 사용하여 요소에 특정 속성이 있는지 확인

jQuery는 웹 페이지에서 DOM 조작 및 이벤트 처리를 처리하는 데 널리 사용되는 인기 있는 JavaScript 라이브러리입니다. jQuery에서 eq() 메서드는 지정된 인덱스 위치에서 요소를 선택하는 데 사용됩니다. 구체적인 사용 및 적용 시나리오는 다음과 같습니다. jQuery에서 eq() 메서드는 지정된 인덱스 위치에 있는 요소를 선택합니다. 인덱스 위치는 0부터 계산되기 시작합니다. 즉, 첫 번째 요소의 인덱스는 0이고 두 번째 요소의 인덱스는 1입니다. eq() 메소드의 구문은 다음과 같습니다: $("s

jQuery는 웹 개발에 널리 사용되는 인기 있는 JavaScript 라이브러리입니다. 웹 개발 중에 JavaScript를 통해 테이블에 새 행을 동적으로 추가해야 하는 경우가 많습니다. 이 기사에서는 jQuery를 사용하여 테이블에 새 행을 추가하는 방법을 소개하고 특정 코드 예제를 제공합니다. 먼저 HTML 페이지에 jQuery 라이브러리를 도입해야 합니다. jQuery 라이브러리는 다음 코드를 통해 태그에 도입될 수 있습니다.
