Как работает jQuery .data ()?

Я хочу использовать .data() в своем приложении. примеры полезны, но я не понимаю, где хранятся значения.

Я проверяю веб-страницу с помощью Firebug, и как только .data () сохраняет объект в элемент dom, я не вижу каких-либо изменений в Firebug (вкладки HTML или Dom).

Я попытался посмотреть исходный код jQuery, но он очень продвинутый для моих знаний Javascript, и я потерял себя.

Итак, вопрос:

Куда на самом деле уходят значения, хранящиеся в jQuery.data ()? Могу ли я проверить / найти / перечислить / отладить их с помощью инструмента?


person kazanaki    schedule 04.05.2010    source источник
comment
вам следует использовать firequery: firequery.binaryage.com. data() расширяет JQuery DOM вашими данными ... Вы должны увидеть, как они запускают firequery   -  person meo    schedule 04.05.2010
comment
Вы смотрели минифицированный источник? Если вы это сделали, не расстраивайтесь ни в малейшей степени, поскольку это совершенно непонятно практически для всех, кроме браузера. Даже несжатый исходный код довольно сложен, и его часто трудно просмотреть. : D   -  person Gordon Gustafson    schedule 28.04.2011
comment
Я сделал пример реализации: проверьте, это очень просто: jsfiddle.net/andrevlima/zb8oo0p0/24 storeData (element, data) // - ›Зарегистрировать новые данные storeData (element) // -› Получить зарегистрированные данные   -  person André Vinícius    schedule 18.03.2017


Ответы (3)


Взгляните на его исходный код.

На первый взгляд кажется, что данные хранятся в переменной cache, созданной в строке 2.

Изменить:

Вот небольшая демонстрация, которая находит данные в кеше: http://jsfiddle.net/CnET9/

Вы также можете выгрузить $.cache на свою консоль и изучить его вручную.

person Matt    schedule 04.05.2010
comment
Нет, эта переменная кеша - это просто внутренняя вещь jQuery. Данные фактически прикреплены к элементу DOM. BTW: Разве он не указал, что исходный код jQ бесполезен? Так зачем его туда указывать? - person selfawaresoup; 04.05.2010
comment
@Techpriester - Вы ошибаетесь, он хранится в переменной кеша с использованием ключа, который представляет ваш элемент DOM, он не хранится в самом элементе DOM. - person Nick Craver; 04.05.2010
comment
Потому что я предполагаю, что он смотрит напрямую на исходный код jQuery, а не на хорошо организованный источник на GitHub. - person Matt; 04.05.2010
comment
Вы можете быстро найти его с помощью $ .cache [domElement [$. Expando]]: jsfiddle.net/N8e4W - person Nick Spacek; 18.01.2012
comment
Привет, Мэтт, можешь ли ты сказать мне, можно ли каким-либо образом отредактировать атрибут data с помощью Firequery, как мы можем сделать, дважды щелкнув обычные атрибуты элемента в Firebug и отредактировав их на месте? В Firequery двойной щелчок по data частям приводит меня к пустому экрану Firebug. - person SexyBeast; 17.03.2013
comment
Итак, я вставил некоторые данные в элемент body в документе, и, конечно же, данные находятся в $.cache[1].data.info. Но как он узнает, что это связано с элементом body? Единственный возможный идентификатор в этом имени переменной - это число 1, а $(*).eq(1), конечно, возвращает элемент head, так что это не так. - person 75th Trombone; 17.09.2013
comment
@ 75thTrombone, потому что jQuery генерирует индекс кеша в атрибуте (используя expando в качестве ключа) в необработанном элементе тела. Expando - это случайное значение, например jQuery19108083871426060796 - вы можете увидеть идентификатор кеша, посмотрев на элемент [jQuery.expando]. Итак, в вашем случае $.cache[$('body')[0][jQuery.expando]].data - см. Data.js Источник, чтобы увидеть волшебство. - person Matt; 17.09.2013
comment
@ 75thTrombone далее, поиск, о котором вы спрашиваете, кажется невозможным (получение элемента DOM из кеша). Поиск всегда происходит наоборот: element - ›cache - person Matt; 17.09.2013
comment
$.cache, похоже, исчез с jQuery 2.0. - person Pang; 01.06.2016

Кажется, вы получили ответ на вопрос, но вот немного о том, как. Есть некоторые правила, о которых вы должны знать, прежде чем использовать это.

ДОБАВЛЕНИЕ

Добавление переменных с использованием объекта, возвращенного из $ ('. Selector'). Data (), работает, потому что объект данных передается по ссылке, поэтому куда бы вы ни добавляли свойство, оно добавляется. Если вы вызываете data () для другого элемента, он изменяется. Это то, что есть ...

var oData = $('#id').data();
oData.num = 0;
oData.num == $('#id').data().num; // true

Добавление объекта помещает объект внутрь объекта данных, а также «расширяет данные, ранее сохраненные с этим элементом». - http://api.jquery.com/data/#entry-longdesc

Это означает, что добавление obj в dataObj становится

oData.obj = {};    
oData === { /*previous data*/, obj : { } }

Добавление массива не расширяет ранее сохраненные данные, но и не ведет себя так же, как простое значение ...

ИСПОЛЬЗУЕТСЯ

Если у вас хранятся простые значения, вы можете поместить их в переменные и делать с ними все, что хотите, не изменяя объект данных.

однако

если вы используете объект или массив для хранения данных об элементе, будьте осторожны!

То, что вы сохраняете его в переменной, не означает, что вы не меняете значение данных. Тот факт, что вы передаете его функции, не означает, что вы не меняете значения данных!

Это то, что есть то, что есть ... если это не просто ... тогда это просто копия. :п

var data             = $("#id").data();  // Get a reference to the data object 
data.r_redirect      = "index.php";      // Add a string value
data.num             = 0;                // Add a integer value
data.arr             = [0,1,2];          // Add an array
data.obj             = { a : "b" };      // Add an object

                                         // but here is where the fun starts! 

var r_redirectString = data.r_redirect;  // returns "index.php", as expected.. cool
r_redirectString     = "changed"         // change the value and the compare :
data.r_redirect      == r_redirectString // returns false, the values are different

var oArr             = data.arr;         // Now lets copy this array
oArr.push(3);                            // and modify it.
data.arr            == oArr              // should be false? Nope. returns true.
                                         // arrays are passed by reference.
                                         // but..

var oObj             = data.obj          // what about objects?       
oObj["key"]          = "value";          // modify the variable and
data.obj["key"]     == oObj["key"]       // it returns true, too!

Итак, ресурсы ..

Как лучше всего хранить несколько значений для jQuery $ .data ()? https://stackoverflow.com/a/5759883/1257652

person Brett Weber    schedule 21.05.2013

Вы можете проверить это, просто вызвав .data() без параметров, например:

$("div").data("thing", "value");​​​​​​
console.log($("div").data());
//or...
console.log($.data($("div").get(0)));

Что касается «где», то оно хранится в глобальном объекте кэша jQuery под ключом, который представляет ваш элемент. Вызов .data() действительно возвращает jQuery.data(yourDomElement), или добавляйте ключ к этому, если вы вызывали из него конкретное значение.

person Nick Craver    schedule 04.05.2010