Подтвердить что ты не робот

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

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

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

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

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

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

4b9b3361

Ответ 1

Посмотрите источник для этого.

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

Edit:

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

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

Ответ 2

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

ДОБАВЛЕНИЕ

Добавление переменных с использованием объекта, возвращаемого из $('. selector'). 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 : { } }

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

USING

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

Однако

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

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

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

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!

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

Каков наилучший способ хранения нескольких значений для $.data()? jQuery? fooobar.com/questions/100122/...

Ответ 3

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

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

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